2012-05-15 48 views
8

Xin chào, tôi đang xây dựng một từ điển mà mỗi khóa là tên khách hàng và mỗi giá trị là danh sách các bộ dữ liệu được mua bởi mỗi khách hàng, như vậy: (sản phẩm, số lượng). Ví dụ:Điền một từ điển Python

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

Tôi đang nhập từ điển dựa trên kết quả của truy vấn SQL. Là một lập trình viên Java mới với Python, ai đó có thể gợi ý cách "pythonic" để làm điều này? Mỗi hàng từ truy vấn chứa tên khách hàng, sản phẩm, số lượng.

+0

Tôi muốn nói điều đó phụ thuộc rất nhiều vào những gì bạn sẽ làm với dữ liệu sau đó. Bạn có phiền phức không? – Pavel

+0

Bạn đã thử bất cứ điều gì cho đến nay? Điều gì làm cho bạn nghĩ rằng cách tiếp cận của bạn là "unpythonic"? –

+0

Tôi sẽ điền một bảng html vào một trang web Django. Diện tích của sự không chắc chắn của tôi là làm thế nào để làm một .append() trên một giá trị mục nhập từ điển. – JCB

Trả lời

10

Trước hết, tôi muốn sử dụng danh sách chứ không phải là bộ dữ liệu làm mục nhập từ điển. Sự khác biệt chính là các danh sách có thể thay đổi, trong khi các tuple thì không.

Tôi nghĩ defaultdict là tốt cho cho vấn đề này:

from collections import defaultdict 

customers = defaultdict(list) 

Bạn có thể thêm các mục như vậy (tất nhiên trong trường hợp của bạn, bạn muốn làm điều này trong một vòng lặp):

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

kết quả là:

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

Đây là chính xác những gì tôi đang tìm kiếm, cảm ơn! – JCB

0

Tôi hy vọng bạn có danh sách các danh sách từ cơ sở dữ liệu của mình, ví dụ:

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

Sau đó, bạn chỉ cần thực hiện.

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

SỰ THẬT Tôi không thể xem lớp cơ sở dữ liệu của bạn trả về –

0

Dưới đây là những gì tôi muốn làm

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) 

nào in

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

cấu trúc bên trong của bạn nên được một danh sách, không phải là một tuple, vì cấu trúc là đồng nhất.

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

này cũng sẽ cho phép bạn sử dụng .append() vào chúng, và bạn có thể sử dụng collections.defaultdict để bắt đầu mỗi giá trị với danh sách trống cho đơn giản hóa hơn nữa.

0

Bạn có thể sử dụng được xây dựng trong defaultdict và nhanh chóng tôi t như một danh sách, và nối thêm các trường bạn muốn vào trong vòng lặp của bạn, ví dụ. nếu bạn muốn toàn bộ hàng ngoại trừ phần tử đầu tiên bạn có thể làm your_defaultdict_instance[row[0]].append(row[1:]), nó sẽ xây dựng mọi thứ gọn gàng.

Các vấn đề liên quan