madde

2009-06-28 28 views
8

Tamam sözlükleri bir piton listesinde frekans, bu yüzden dicts bir listesi var:madde

[{'name': 'johnny', 'surname': 'smith', 'age': 53}, 
{'name': 'johnny', 'surname': 'ryan', 'age': 13}, 
{'name': 'jakob', 'surname': 'smith', 'age': 27}, 
{'name': 'aaron', 'surname': 'specter', 'age': 22}, 
{'name': 'max', 'surname': 'headroom', 'age': 108}, 
] 

ve her sütun içinde öğelerin 'frekansını' istiyoruz. böyle şeyler yapabileceğimiz dikkat

{'name': {'johnny': 2, 'jakob': 1, 'aaron': 1, 'max': 1}, 
'surname': {'smith': 2, 'ryan': 1, 'specter': 1, 'headroom': 1}, 
'age': {53:1, 13:1, 27: 1. 22:1, 108:1}} 

Herhangi modüllerin: Yani bunun için ben böyle bir şey olsun ki? kurtarmaya standart kitaplığından

cevap

13

collections.defaultdict:

from collections import defaultdict 

LofD = [{'name': 'johnny', 'surname': 'smith', 'age': 53}, 
{'name': 'johnny', 'surname': 'ryan', 'age': 13}, 
{'name': 'jakob', 'surname': 'smith', 'age': 27}, 
{'name': 'aaron', 'surname': 'specter', 'age': 22}, 
{'name': 'max', 'surname': 'headroom', 'age': 108}, 
] 

def counters(): 
    return defaultdict(int) 

def freqs(LofD): 
    r = defaultdict(counters) 
    for d in LofD: 
    for k, v in d.items(): 
     r[k][v] += 1 
    return dict((k, dict(v)) for k, v in r.items()) 

print freqs(LofD) 

istenen (tabii ayrı tuşların sırasına, - bir dict alakasız) olarak

{'age': {27: 1, 108: 1, 53: 1, 22: 1, 13: 1}, 'surname': {'headroom': 1, 'smith': 2, 'specter': 1, 'ryan': 1}, 'name': {'jakob': 1, 'max': 1, 'aaron': 1, 'johnny': 2}} 

yayar.

1

Bu?

from collections import defaultdict 
fq = { 'name': defaultdict(int), 'surname': defaultdict(int), 'age': defaultdict(int) } 
for row in listOfDicts: 
    for field in fq: 
     fq[field][row[field]] += 1 
print fq 
2
items = [{'name': 'johnny', 'surname': 'smith', 'age': 53}, {'name': 'johnny', 'surname': 'ryan', 'age': 13}, {'name': 'jakob', 'surname': 'smith', 'age': 27}, {'name': 'aaron', 'surname': 'specter', 'age': 22}, {'name': 'max', 'surname': 'headroom', 'age': 108}] 

global_dict = {} 

for item in items: 
    for key, value in item.items(): 
     if not global_dict.has_key(key): 
      global_dict[key] = {} 

     if not global_dict[key].has_key(value): 
      global_dict[key][value] = 0 

     global_dict[key][value] += 1 

print global_dict 

En basit çözüm ve aslında test etti.

+0

, collections.defaultdict duymamıştı. – dochead

+0

collections.defaultdict'ın içerdiği "has_key yok" mantığını çoğaltmak nasıl daha basit? 1.5.2'de yaptığım buydu (daha basit ve daha hızlı bir deyim oluşturduktan önce, eğer global_dict'de 2.0 değilse) fakat “arkaik sürümlerle uyumlu”, “basit”; –

+0

Yeni başlayanlar için en kolaysı :) – zinovii

2

Yeni Python 3.1: collections.Counter sınıfı:

mydict=[{'name': 'johnny', 'surname': 'smith', 'age': 53}, 
{'name': 'johnny', 'surname': 'ryan', 'age': 13}, 
{'name': 'jakob', 'surname': 'smith', 'age': 27}, 
{'name': 'aaron', 'surname': 'specter', 'age': 22}, 
{'name': 'max', 'surname': 'headroom', 'age': 108}, 
] 

import collections 
newdict = {} 

for key in mydict[0].keys(): 
    l = [value[key] for value in mydict] 
    newdict[key] = dict(collections.Counter(l)) 

print(newdict) 

çıkışlar:

muhtemelen sonunda yapardım nasıl
{'age': {27: 1, 108: 1, 53: 1, 22: 1, 13: 1}, 
'surname': {'headroom': 1, 'smith': 2, 'specter': 1, 'ryan': 1}, 
'name': {'jakob': 1, 'max': 1, 'aaron': 1, 'johnny': 2}}