2013-08-12 20 views
13

Mam następujący słownika korzystałsłownika Grupa w Pythonie

mylist = [{'tpdt': '0.00', 'tmst': 45.0, 'tmdt': 45.0, 'pbc': 30, 'remarks': False, 'shift': 1, 'ebct': '0.00', 'tmcdt': '0.00', 'mc_no': 'KA20'}, 
      {'tpdt': '0.00', 'tmst': 45.0, 'tmdt': 45.0, 'pbc': 30, 'remarks': False, 'shift': 1, 'ebct': '0.00', 'tmcdt': '0.00', 'mc_no': 'KA20'}, 
      {'tpdt': '0.00', 'tmst': 55.0, 'tmdt': 55.0, 'pbc': 30, 'remarks': False, 'shift': 1, 'ebct': '0.00', 'tmcdt': '0.00', 'mc_no': 'KA23'}, 
      {'tpdt': '0.00', 'tmst': 55.0, 'tmdt': 55.0, 'pbc': 30, 'remarks': False, 'shift': 1, 'ebct': '0.00', 'tmcdt': '0.00', 'mc_no': 'KA23'}] 

chcę uzyskać sumę kluczowego „tmst” dla każdego słownik wartościami należy KA20 'i „KA23” na liście słowników.

Czy możesz prosić o swoje sugestie?

+1

Co próbowaliście? Z czym masz problem? Czy możesz przeglądać każdy słownik na liście? Czy możesz sprawdzić, czy klucz istnieje w słowniku? – jozzas

+0

Tak, mogę przechodzić przez słownik i sprawdzać również klucz. Wartość klucza "mc_no" może być taka sama dla słowników na liście. potrzebuję uzyskać sumę wartości klucza ("tmst") dla tych samych wartości "mc_no". – Alchemist777

Odpowiedz

20

Można użyć itertools.groupby:

>>> for key, group in itertools.groupby(mylist, lambda item: item["mc_no"]): 
...  print key, sum([item["tmst"] for item in group]) 
... 
KA20 90.0 
KA23 110.0 

Zauważ, że dla groupby działał prawidłowo, mylist musi być sortowane przez grupowanie klucz:

from operator import itemgetter 

mylist.sort(key=itemgetter("mc_no")) 
+3

Uwaga: 1 - dodaj 'mylist.sort (key = itemgetter (" mc_no "))' w przeciwnym razie 'groupby()' nie zadziała. 2- 'sum (map (itemgetter (" tmst "), group))' – jfs

+0

@ J.F.Sebastian dobry punkt, poprawił odpowiedź. Dziękuję Ci! – alecxe

5

Najpierw musi rozwiązać tę listę słowników .. używając następującego kodu .. Przykł.

 
    animals = [{'name':'cow', 'size':'large'},{'name':'bird', 'size':'small'},{'name':'fish', 'size':'small'},{'name':'rabbit', 'size':'medium'},{'name':'pony', 'size':'large'},{'name':'squirrel', 'size':'medium'},{'name':'fox', 'size':'medium'}] 

    import itertools 
    from operator import itemgetter 
    sorted_animals = sorted(animals, key=itemgetter('size')) 

następnie użyć poniższy kod

 
    for key, group in itertools.groupby(sorted_animals, key=lambda x:x['size']): 
     print key, 
     print list(group) 

Po dostaniesz następujący wynik ...

 
large [{'name': 'cow', 'size': 'large'}, {'name': 'pony', 'size':'large'}] 
medium [{'name': 'rabbit', 'size': 'medium'}, {'name': 'squirrel', 'size':'medium'}, {'name': 'fox', 'size': 'medium'}] 
small [{'name': 'bird', 'size': 'small'}, {'name': 'fish', 'size': 'small'}] 
2

Oto kod, który nie wymaga mylist być klasyfikowane według klucza "mc_no" :

from collections import defaultdict 

sums = defaultdict(int) # key -> sum 
for d in mylist: 
    sums[d["mc_no"]] += d["tmst"] 
Powiązane problemy