2012-05-15 16 views
8

Witam Buduję słownik, w którym każdy klucz jest nazwą klienta, a każda wartość jest listą krotek, które są kupowane przez każdego klienta, jak na przykład: (produkt, ilość). Na przykład:Zapełnianie słownika Python

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

Zapełniam słownik na podstawie wyników zapytania SQL. Będąc programistą Javy w Pythonie, czy ktoś może zaproponować "pythonic" sposób na zrobienie tego? Każdy wiersz zapytania zawiera nazwę klienta, produkt, ilość.

+0

Powiedziałbym, że to zależy od tego, co później zrobisz z danymi. Czy zastanawiasz się nad opracowaniem? – Pavel

+0

Czy próbowałeś cokolwiek do tej pory? Co sprawia, że ​​myślisz, że twoje podejście jest "niepythoniczne"? –

+0

Będę wypełniać tabelę html na stronie Django. Obszarem mojej niepewności jest jak zrobić .append() na wartości wpisu słownikowego. – JCB

Odpowiedz

10

Przede wszystkim użyłbym list, a nie krotek jako wpisów słownikowych. Główna różnica polega na tym, że listy są zmienne, a krotki nie.

myślę defaultdict jest dobre dla tego problemu:

from collections import defaultdict 

customers = defaultdict(list) 

Można dodawać wpisy jak tak (oczywiście w przypadku, że można to zrobić w pętli):

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

wynikiem jest:

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

To jest dokładnie czego szukałem, dzięki! – JCB

0

Mam nadzieję, że masz listę list z bazy danych, np.

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

Następnie można po prostu zrobić.

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

OCZYWIŚCIE Nie widzę, co zwróciła twoja warstwa bazy danych –

0

Oto co zrobię

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) 

która drukuje

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

Twoja wewnętrzna struktura powinna być lista, nie krotki, ponieważ struktura jest jednorodna.

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

Pozwoli to również na użycie .append() na nich, i można użyć collections.defaultdict zacząć każdą wartość z pustej listy do dalszego uproszczenia.

0

można użyć wbudowanego defaultdict i i instancji t jako listę i dodaj pola, które chcesz, do swojej pętli, np. jeśli chcesz cały rząd, z wyjątkiem pierwszego elementu, możesz zrobić your_defaultdict_instance[row[0]].append(row[1:]), który będzie starannie budował wszystko.

Powiązane problemy