2012-05-15 3 views
8

Привет, Я строил словарь, где каждый ключ является именем клиента, а каждое значение представляет собой список кортежей, которые покупаются каждым клиентом, например: (продукт, количество). Например:Заполнение словаря на Python

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

Я заполняю словарь на основе результатов SQL-запроса. Являясь программистом Java, новым для Python, может ли кто-нибудь предложить «питонический» способ сделать это? Каждая строка из запроса содержит имя, продукт, количество.

+0

Я бы сказал, что это сильно зависит от того, что вы собираетесь делать с данными впоследствии. Не возражаете ли вы разработать? – Pavel

+0

Вы что-нибудь пытались сделать? Что заставляет вас думать, что ваш подход «бесстрашный»? –

+0

Я буду заполнять таблицу html на веб-странице Django. Область моей неопределенности заключается в том, как сделать .append() в значении словаря. – JCB

ответ

10

Прежде всего, я бы использовал списки, а не кортежи, как словарные записи. Основное отличие состоит в том, что списки изменяемы, а кортежи - нет.

Я думаю defaultdict это хорошо для этой проблемы:

from collections import defaultdict 

customers = defaultdict(list) 

Вы можете добавлять записи, как это (конечно, в вашем случае, вы могли бы сделать это в цикле):

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

результат:

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

Это точно что я искал, спасибо! – JCB

0

Я надеюсь, что у вас есть список списков из вашей базы данных, т.е.

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

Тогда вы можете просто сделать.

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

ОБОСНОВАННО. Я не вижу, как возвращается ваш уровень базы данных. –

0

Вот что я хотел бы сделать

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) 

который печатает

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

Ваша внутренняя структура должна быть списком, а не кортеж, так как структура однородна.

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

Это также позволит вам использовать .append() на них, и вы можете использовать collections.defaultdict для начала каждого значения с пустым списком для дальнейшего упрощения.

0

Вы можете использовать встроенный defaultdict и экземпляр I t в качестве списка и добавьте поля, которые вы хотите использовать в своем цикле, например. если вам нужна вся строка, кроме первого элемента, вы можете сделать your_defaultdict_instance[row[0]].append(row[1:]), который будет аккуратно строить все.