2013-09-22 11 views

cevap

7

var mı ne dersiniz

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 

Not jeneratör ziyade 1'lerin genel listesinin kullanımı. Bu oldukça yerleşik bir tekniktir ve muhtemelen birkaç StackOverflow sorusu üzerinde görünür.

Bu yöntem, x'un gerçekleştiği olay sayısını saydığınız için list.count(x)'dan yararlanmanın bir yolunu göremiyorum. Python, filter yöntemine sahiptir, ancak anlama çok daha fazla tercih edilir.

+0

ben yanıtında son satırında mesajınızı anlamıyorum - piton öğrenen. –

+2

Eğer "(a için x için 1)" ve "a" büyük bir liste yazıyorsam, liste kavraması teorik olarak 1'lerin büyük bir listesini oluşturur, THEN hepsini toplar. Ama eğer "toplamı" (x için a) 'a yazarsam, o zaman 1'ler, büyük yapı gerçekleşmeden "a" üzerinde yinelenerek toplanır. –

+0

Şimdi Anladım! benim için çok yararlı bilgiler. Size çok teşekkür ederim. –

6

Ray'ın yanıtını beğeniyorum. Başka bir harika hile collections.Counter kullanmaktır.

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 

Bu çözüm birden fazla anahtar/değer saymak gerekirse özellikle iyidir.

yalnızca belirli bir anahtarın önem veriyorsan bunu yapabilirsiniz:

k = 'id' 
id_counter = Counter(dct.get(k) for dct in my_list) 
id_counter 
=> Counter({2: 2, 1: 1}) 
id_counter[2] 
=> 2 
İlgili konular