2012-06-17 9 views
12

datos:Cambio trama de datos del marcador a dict marco

pair = collections.defaultdict(collections.Counter) 

por ejemplo,

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

quiero seguir la trama de datos, sino alterar el tipo de esta parte {'word1':4, 'word2':3}{'word1':2, 'word3':4}``... Ahora es un Counter y necesito un dict.

yo probamos este para obtener los datos de pair, pero no saben cómo crear un dict para cada 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 

no quiero cambiar la salida. Solo necesito ese en cada documento, el tipo de datos es dict, no Counter.

+1

Publique la trazabilidad real y más contexto. – agf

+0

¿QUIÉN dice que 'el primer argumento debe ser invocable'? – joaquin

+0

¿qué es lo que quieres? ¿Puedes dar el resultado que quieres? – shihongzhi

Respuesta

20

A Counter ya es un dict - o, una subclase de ella. Pero, si realmente necesita exactamente un dict por alguna razón, entonces es una sola línea:

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

Cualquier Mapping (cualquier cosa que se comporta como un diccionario) se puede pasar en dict, y obtendrá un dict con los mismos contenidos No hay necesidad de iterar sobre él para construirlo usted mismo.

Esto le proporciona un bucle, con una línea en el cuerpo en lugar de un bucle anidado. Sin embargo, cualquier código del formulario:

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

general se puede hacer en una línea usando un generador de expresión o una lista, fijar o comprensión dict. Estamos construyendo un dict, por lo que un dict comprehension (la sección de ejemplos es lo que más le interesa) parece probable. Dejaré que aparezca como un ejercicio para el lector. ;-)

+1

+1 Dado que se necesita la funcionalidad de un 'Contador', solo se puede convertir en' dict' después, por lo que esta es la única forma de hacerlo. – jamylak

+1

@jamylak kk. Gracias. – juju

0

Quizás esté interesado para:

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

¿No funcionaría 'dd (dict)' en lugar de 'dd (lambda: dict())'? – DSM

+0

@DSM, sí, obviamente, mi culpa. – 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

El Counter es también un dict. Pero depende de lo que necesite, tal vez el código siguiente es el que desea.

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

new_pair dict es usted quiere. ¡Buena suerte!