Row*_*anX 10 python dictionary counting python-3.x
如果我有这样的事情:
D = {'a': 97, 'c': 0 , 'b':0,'e': 94, 'r': 97 , 'g':0}
Run Code Online (Sandbox Code Playgroud)
如果我想要例如将"0"的出现次数计算为一个值而不必迭代整个列表,那么这是否可能?如何?
Kas*_*mvd 14
正如我在评论中提到的,你可以在sum()函数中使用如下的函数:
sum(value == 0 for value in D.values())
Run Code Online (Sandbox Code Playgroud)
或者作为稍微更优化和功能的方法,您可以使用map以下功能:
sum(map((0).__eq__, D.values()))
Run Code Online (Sandbox Code Playgroud)
基准测试:
In [56]: %timeit sum(map((0).__eq__, D.values()))
1000000 loops, best of 3: 756 ns per loop
In [57]: %timeit sum(value == 0 for value in D.values())
1000000 loops, best of 3: 977 ns per loop
Run Code Online (Sandbox Code Playgroud)
请注意,虽然map在这种情况下使用函数可能会更加优化,但为了实现关于这两种方法的全面和一般的概念,您还应该为相对较大的数据集运行基准.然后您可以决定何时使用哪个以获得更高的性能.
您可以将其转换为列表,如下所示:
D = {'a': 97, 'c': 0 , 'b':0,'e': 94, 'r': 97 , 'g':0}
print(list(D.values()).count(0))
>>3
Run Code Online (Sandbox Code Playgroud)
或者迭代这些值:
print(sum([1 for i in D.values() if i == 0]))
>>3
Run Code Online (Sandbox Code Playgroud)
或者,使用collections.Counter:
from collections import Counter
D = {'a': 97, 'c': 0 , 'b':0,'e': 94, 'r': 97 , 'g':0}
Counter(D.values())[0]
# 3
Run Code Online (Sandbox Code Playgroud)
那是 的工作operator.countOf。
countOf(D.values(), 0)\nRun Code Online (Sandbox Code Playgroud)\n使用示例词典进行基准测试:
\n1537 ns 1540 ns 1542 ns Counter(D.values())[0]\n 791 ns 800 ns 802 ns sum(value == 0 for value in D.values())\n 694 ns 697 ns 717 ns sum(map((0).__eq__, D.values()))\n 680 ns 682 ns 689 ns sum(1 for value in D.values() if value == 0)\n 599 ns 599 ns 600 ns sum([1 for i in D.values() if i == 0])\n 368 ns 369 ns 375 ns list(D.values()).count(0)\n 229 ns 231 ns 231 ns countOf(D.values(), 0)\nRun Code Online (Sandbox Code Playgroud)\n代码(在线尝试!):
\nfrom timeit import repeat\n\nsetup = \'\'\'\nfrom collections import Counter\nfrom operator import countOf\nD = {\'a\': 97, \'c\': 0 , \'b\':0,\'e\': 94, \'r\': 97 , \'g\':0}\n\'\'\'\n\nE = [\n \'Counter(D.values())[0]\',\n \'sum(value == 0 for value in D.values())\',\n \'sum(map((0).__eq__, D.values()))\',\n \'sum(1 for value in D.values() if value == 0)\',\n \'sum([1 for i in D.values() if i == 0])\',\n \'list(D.values()).count(0)\',\n \'countOf(D.values(), 0)\',\n]\n\nfor _ in range(3):\n for e in E:\n number = 10 ** 5\n ts = sorted(repeat(e, setup, number=number))[:3]\n print(*(\'%4d ns \' % (t / number * 1e9) for t in ts), e)\n print()\nRun Code Online (Sandbox Code Playgroud)\n