2012-05-15 20 views
8

Hola, estoy construyendo un diccionario donde cada clave es un nombre de cliente y cada valor es una lista de tuplas que cada cliente compra, como por ejemplo: (producto, cantidad). Por ejemplo:Poblando un diccionario de Python

{'customer1': (('milk', 3), ('bread', 5), ('eggs', 2)), 
'customer2': (('cheese', 2), ('cereal', 7))} 

Estoy poblando el diccionario según los resultados de una consulta SQL. Siendo un programador de Java nuevo para Python, ¿alguien puede sugerir la forma "pitonica" de hacer esto? Cada fila de la consulta contiene el nombre del cliente, producto, cantidad.

+0

Yo diría que depende en gran medida de lo que va a hacer con los datos después. ¿Te importa elaborar? – Pavel

+0

¿Has intentado algo hasta ahora? ¿Qué te hace pensar que tu enfoque es "antiponético"? –

+0

Voy a rellenar una tabla html en una página web de Django. El área de mi incertidumbre es cómo hacer un .append() en un valor de entrada del diccionario. – JCB

Respuesta

10

En primer lugar, utilizaría listas en lugar de tuplas como entradas de diccionario. La principal diferencia es que las listas son mutables, mientras que las tuplas no.

Creo defaultdict es un bien para este problema:

from collections import defaultdict 

customers = defaultdict(list) 

puede agregar entradas al igual que (por supuesto, en su caso que haría esto en un bucle):

customers['customer1'].append(('milk', 3)) 
customers['customer1'].append(('bread', 5)) 
customers['customer2'].append(('cereal', 7)) 

el resultado es:

>>> print dict(customers) 
{'customer1': [('milk', 3), ('bread', 5)], 'customer2': [('cereal', 7)]} 
+0

Esto es exactamente lo que estaba buscando, gracias! – JCB

0

Espero que tenga una lista de listas de su base de datos, por ejemplo,

rows = [('customer1', ('milk', 2)), ('customer12', ('bread', 4))] # etc etc 

Entonces usted puede simplemente hacer.

for row in rows: 
    cust_dict[row[0]] = row[1:] 
+0

OBVIAMENTE No puedo ver qué devolvió la capa de su base de datos –

0

Aquí es lo que haría

from collections import defaultdict 

data = (
    ('customer1', 'milk', 3), 
    ('customer1', 'bread', 5), 
    ('customer1', 'eggs', 2), 
    ('customer2', 'cheese', 2), 
    ('customer2', 'cereal', 7), 
    ) 

result = defaultdict(list) 
for name, what, amount in data: 
    result[name].append((what, amount)) 

from pprint import pprint 
result = dict(result) 
pprint(result) 

que imprime

{'customer1': [('milk', 3), ('bread', 5), ('eggs', 2)], 
'customer2': [('cheese', 2), ('cereal', 7)]} 
1

Su estructura interna debe ser una lista, no una tupla, ya que la estructura es homogénea.

{'customer1': [('milk', 3), ('bread', 5), ('eggs', 2)], 
'customer2': [('cheese', 2), ('cereal', 7)]} 

Esto también le permitirá utilizar .append() en ellos, y se puede utilizar para empezar collections.defaultdict cada valor con una lista vacía de una mayor simplificación.

0

Usted puede utilizar el incorporado en defaultdict y cree una instancia i t como una lista, y anexe los campos que desea en su ciclo, por ej. si desea la fila completa, excepto el primer elemento, puede hacer your_defaultdict_instance[row[0]].append(row[1:]), que construirá todo cuidadosamente.