如何计算词典列表中项目的出现次数?

Jam*_*mie 5 python python-2.7

我有一个词典列表(缩写).

my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }]
Run Code Online (Sandbox Code Playgroud)

如何计算具有特定键的指定值的字典的出现次数(在本例中为' id')?有没有办法利用计数(my_list.count('id' = 1)?!?)

Ray*_*oal 7

怎么样

sum(1 for d in my_list if d.get('id') == the_value_you_are_interested_in)

>>> my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }]
>>> sum(1 for d in my_list if d.get('id') == 1)
1
>>> sum(1 for d in my_list if d.get('id') == 2)
2
>>> sum(1 for d in my_list if d.get('id') == 20)
0
Run Code Online (Sandbox Code Playgroud)

注意使用生成器而不是1的列表.这是一种非常成熟的技术,可能出现在几个StackOverflow问题上.

我没有看到任何方法可以利用,list.count(x)因为此方法计算出现次数x,在您的情况下将是完整的词典.Python确实有一个filter方法,但理解是更受欢迎的.

  • 如果我写`sum([1 for x in a])`和`a`是一个巨大的列表,那么列表理解理论上会生成一个巨大的1列表,然后将它们全部加起来.但是如果我写`sum(1 for x in a)`那么1s被总结为`a`被迭代,没有实现大结构. (2认同)

shx*_*hx2 6

我喜欢@Ray的回答.另一个很酷的技巧是使用collections.Counter.

from collections import Counter

c = Counter( item for dct in my_list for item in dct.items() )
c
=> Counter({('id', 2): 2, ('val', 123): 1, ('id', 1): 1, ('val', 456): 1, ('val', 789): 1})

c[('id', 2)]
=> 2
c[('id', 1)]
=> 1
c[('id', 20)]
=> 0
Run Code Online (Sandbox Code Playgroud)

如果您需要计算多个键/值,此解决方案特别好.

如果您只关心特定密钥,您可以:

k = 'id'
id_counter = Counter( dct.get(k) for dct in my_list )
id_counter
=> Counter({2: 2, 1: 1})
id_counter[2]
=> 2
Run Code Online (Sandbox Code Playgroud)