2012-06-17 14 views
12

dati:Change frame di dati da contatore a dict telaio

pair = collections.defaultdict(collections.Counter) 

esempio

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

voglio mantenere il frame di dati, ma modificare il tipo di questa parte {'word1':4, 'word2':3}{'word1':2, 'word3':4}``... Ora è un Counter e ho bisogno di un dict.

ho provato questo per ottenere i dati da pair, ma non so come creare un dict per ogni documento:

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

Io non voglio cambiare l'output. Ho solo bisogno di quello in ciascun documento, il tipo di dati è dict, non Counter.

+1

Invia il traceback effettivo e più contesto. – agf

+0

CHI dice che "il primo argomento deve essere chiamabile"? – joaquin

+0

cosa vuoi? Puoi dare l'output che vuoi? – shihongzhi

risposta

20

A Counter è già un dict - o una sottoclasse di esso. Ma, se si ha realmente bisogno esattamente un dict per qualche ragione, allora la sua una battuta:

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

Qualsiasi Mapping (tutto ciò che si comporta come un dizionario) possono essere passati in dict, e si otterrà un dict con lo stesso contenuto. Non c'è bisogno di iterare su di esso per costruirlo da soli.

Questo ti dà un ciclo, con una linea nel corpo invece di un ciclo annidato. Ma ogni codice del modulo:

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

solito può essere fatto in una sola riga utilizzando un generatore di espressione o di un elenco, impostare o dict comprensione. Stiamo creando un dict, quindi un dict comprehension (la sezione degli esempi è ciò che ti interessa di più) sembra probabile. Lascerò venire come un esercizio per il lettore. ;-)

+1

+1 Poiché la funzionalità di un 'Counter' è necessaria, può essere convertita in' dict' solo dopo, quindi questo è l'unico modo per farlo. – jamylak

+1

@jamylak kk. Grazie. – juju

0

Forse siete alla ricerca di:

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

Non 'dd (dict)' funziona invece di 'dd (lambda: dict())'? – DSM

+0

@DSM, sì, ovviamente, colpa mia. – 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

Il Counter è anche un dict. Ma dipende dal tuo bisogno, forse il codice seguente è quello che vuoi.

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

il new_pair dict si desidera. In bocca al lupo!

Problemi correlati