辞書のリスト(省略)があります。
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 のリストではなくジェネレータを使用していることに注意してください。これはかなり確立された手法であり、おそらくスタック オーバーフローのいくつかの質問に表示されます。
list.count(x)
このメソッドは の出現回数をカウントするため、活用する方法はありません。このx
場合、完全な辞書になります。Python にはfilter
メソッドがありますが、内包表記の方がはるかに好まれます。
@Rayの答えが好きです。もう 1 つのクールなトリックは、 を使用すること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