2012-05-15 16 views
8

हाय मैं एक शब्दकोश का निर्माण कर रहा हूं जहां प्रत्येक कुंजी ग्राहक का नाम है और प्रत्येक मान प्रत्येक ग्राहक द्वारा खरीदे गए tuples की एक सूची है, जैसे: (उत्पाद, मात्रा)। उदाहरण के लिए:एक पाइथन शब्दकोश को पॉप्युलेट करना

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

मैं SQL क्वेरी के परिणामों के आधार पर शब्दकोश को पॉप्युलेट कर रहा हूं। पाइथन के लिए नया जावा प्रोग्रामर होने के नाते, क्या कोई ऐसा करने के लिए "पायथनिक" तरीका सुझा सकता है? क्वेरी से प्रत्येक पंक्ति में ग्राहक का नाम, उत्पाद, मात्रा शामिल है।

+0

मैं कहना चाहता हूँ कि यह आप बाद में डेटा के साथ क्या करने जा रहे हैं पर दृढ़ता से निर्भर करता है। क्या आप विस्तार से सोचते हैं? – Pavel

+0

क्या आपने अभी तक कुछ भी प्रयास किया है? आपको क्या लगता है कि आपका दृष्टिकोण "अवांछित" है? –

+0

मैं एक Django वेबपेज में एक HTML तालिका पॉप्युलेट कर दिया जाएगा। मेरी अनिश्चितता के क्षेत्र कैसे एक .append() एक शब्दकोश प्रविष्टि मूल्य पर करने के लिए है। – JCB

उत्तर

10

सबसे पहले, मैं शब्दकोश प्रविष्टियों के रूप में tuples के बजाय सूचियों का उपयोग करता हूं। मुख्य अंतर यह है कि सूचियां उत्परिवर्तनीय हैं, जबकि टुपल्स नहीं हैं।

मुझे लगता है कि 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 और मैं का दृष्टांत एक सूची के रूप में, और उन क्षेत्रों को संलग्न करें जिन्हें आप अपने लूप में चाहते हैं, उदाहरण के लिए। यदि आप पहले तत्व को छोड़कर पूरी पंक्ति चाहते थे तो आप your_defaultdict_instance[row[0]].append(row[1:]) कर सकते हैं जो अच्छी तरह से सबकुछ तैयार करेगा।

संबंधित मुद्दे