我有一個字典列表(縮寫)。如何計算字典列表中某個項目的出現次數?
my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }]
我怎麼能指望詞典的出現與指定的值(在這種情況下,「id
」)的特定鍵?有沒有一種辦法,把槓桿計數(my_list.count('id' = 1)
?!?)
我有一個字典列表(縮寫)。如何計算字典列表中某個項目的出現次數?
my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }]
我怎麼能指望詞典的出現與指定的值(在這種情況下,「id
」)的特定鍵?有沒有一種辦法,把槓桿計數(my_list.count('id' = 1)
?!?)
如何
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
方法,但理解更受歡迎。
我喜歡@ 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
我不明白,在回答最後一行的消息 - 蟒蛇的學習者。 –
如果我寫'sum([1 for x in a])''a'是一個巨大的列表,那麼列表理解理論上會生成一個1的大列表,然後將它們總和。但是如果我寫'sum(1 for x in a)',那麼1就會被迭代,因爲'a'正在迭代,沒有實現大的結構。 –
明白了!對我來說非常有用的信息。非常感謝你。 –