计算python中字典中某个值的出现次数?

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在这种情况下使用函数可能会更加优化,但为了实现关于这两种方法的全面和一般的概念,您还应该为相对较大的数据集运行基准.然后您可以决定何时使用哪个以获得更高的性能.


use*_*754 9

您可以将其转换为列表,如下所示:

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)


bla*_*ite 7

或者,使用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)


Kel*_*ndy 5

那是 的工作operator.countOf

\n
countOf(D.values(), 0)\n
Run Code Online (Sandbox Code Playgroud)\n

使用示例词典进行基准测试:

\n
1537 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)\n
Run Code Online (Sandbox Code Playgroud)\n

代码(在线尝试!):

\n
from 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()\n
Run Code Online (Sandbox Code Playgroud)\n