2013-09-22 43 views
5

我有一个字典列表(缩写)。如何计算字典列表中某个项目的出现次数?

my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }] 

我怎么能指望词典的出现与指定的值(在这种情况下,“id”)的特定键?有没有一种办法,把杠杆计数(my_list.count('id' = 1)?!?)

回答

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 

注意使用发电机而不是1秒的列表的。这是一个非常成熟的技术,可能出现在几个StackOverflow问题上。

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

+0

我不明白,在回答最后一行的消息 - 蟒蛇的学习者。 –

+2

如果我写'sum([1 for x in a])''a'是一个巨大的列表,那么列表理解理论上会生成一个1的大列表,然后将它们总和。但是如果我写'sum(1 for x in a)',那么1就会被迭代,因为'a'正在迭代,没有实现大的结构。 –

+0

明白了!对我来说非常有用的信息。非常感谢你。 –

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 

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

如果你只关心一个特定的键,你可以这样做:

k = 'id' 
id_counter = Counter(dct.get(k) for dct in my_list) 
id_counter 
=> Counter({2: 2, 1: 1}) 
id_counter[2] 
=> 2 
相关问题