2012-06-17 14 views
12

Dane:rama danych z licznika do dict ramki

pair = collections.defaultdict(collections.Counter) 

np

pair = {'doc1': {'word1':4, 'word2':3}, 
     'doc2': {'word1':2, 'word3':4}, 
     'doc3': {'word2':2, 'word4':1}, 
     ...} 

chcę zachować ramkę danych, ale zmienia typ tej części {'word1':4, 'word2':3}{'word1':2, 'word3':4}``... Teraz jest Counter i muszę dict.

Próbowałem to, aby uzyskać dane z pair, ale nie wiem jak stworzyć dict dla każdego dokumentu:

new_pair = collections.defaultdict(collections.Counter) 
for doc, tab in testing.form.items(): 
    for word, freq in tab.items(): 
     new_pair[doc][word] = freq 

Nie chcę, aby zmienić wyjście. Po prostu potrzebuję tego w każdym dokumencie, typem danych jest dict, a nie Counter.

+1

Opublikuj rzeczywiste traceback i więcej kontekstów. – agf

+0

WHO mówi, że "pierwszy argument musi być możliwy do wywołania"? – joaquin

+0

czego chcesz? Czy możesz dać wynik, który chcesz? – shihongzhi

Odpowiedz

20

A Counter jest już dict - lub jego podklasą. Ale, jeśli naprawdę trzeba dokładnie dict z jakiegoś powodu, to jest to jedno-liner:

>>> c = Counter(word1=4, word2=3) 
>>> c 
Counter({'word1': 4, 'word2': 3}) 
>>> dict(c) 
{'word1': 4, 'word2': 3} 

Wszelkie Mapping (nic, że zachowuje się jak słownik) mogą być przekazywane do dict, a dostaniesz dict z ta sama zawartość. Nie ma potrzeby powtarzania go, aby samemu go utworzyć.

Daje to jedną pętlę, z jedną linią w ciele zamiast z pętli zagnieżdżonej. Ale każdy kod w postaci:

thing = a new empty collection 
for elem in old_thing: 
    Add something to do with elem to thing 

zazwyczaj można zrobić w jednej linii z wykorzystaniem generatora wyrażenie lub listę ustaw lub dict zrozumieniem. Budujemy model dict, więc prawdopodobnie wydaje się być dict comprehension (sekcja Przykłady jest tym, co Cię najbardziej interesuje). Zostawię to jako ćwiczenie dla czytelnika. ;-)

+1

+1 Ponieważ funkcjonalność 'Counter' jest potrzebna, można ją przekonwertować tylko na' dict', więc jest to jedyny sposób na zrobienie tego. – jamylak

+1

@jamylak kk. dzięki. – juju

0

Może szukasz:

>>> from collections import defaultdict 
>>> pair = defaultdict(dict) 
>>> pair[3][2]='hello' 
>>> 
>>> pair 
defaultdict(<type 'dict'>, {3: {2: 'hello'}}) 
>>> 
>>> pair[3] 
{2: 'hello'} 
>>> 
+0

Czy zamiast tego 'dd (lambda: dict()) nie działa' dd (dict) '? – DSM

+0

@ DSM, tak, oczywiście, moja wina. – joaquin

0
new_pair = {} # simple dict at the top level 
for doc, tab in testing.form.items(): 
    for word, freq in tab.items(): 
     # top-level values is word counters 
     new_pair[doc].setdefault(word, Counter()) += freq 
0

Counter również dict. Ale zależy to od ciebie, może kod podąża za tym.

new_pair ={} 
for doc, tab in pari.items(): 
    new_pair[doc] = {} 
    for word, freq in tab.items(): 
     new_pair[doc][word] = freq 

Dyktowanie jest potrzebne. Powodzenia!

Powiązane problemy