पायथन सूची का एक शब्दकोश बनाने


214

मैं एक ऐसा शब्दकोश बनाना चाहता हूँ, जिसके मूल्य सूचियाँ हों। उदाहरण के लिए:

{
  1: ['1'],
  2: ['1','2'],
  3: ['2']
}

यदि मैं करता हूँ:

d = dict()
a = ['1', '2']
for i in a:
    for j in range(int(i), int(i) + 2): 
        d[j].append(i)

मुझे एक KeyError मिलती है, क्योंकि d [...] एक सूची नहीं है। इस मामले में, मैं शब्दकोश को आरंभ करने के लिए असाइनमेंट के बाद निम्नलिखित कोड जोड़ सकता हूं।

for x in range(1, 4):
    d[x] = list()

क्या ऐसा करने के लिए इससे अच्छा तरीका है? आइए बताते हैं कि जब तक मैं दूसरे forलूप में हूं, मुझे उन चाबियों की जानकारी नहीं है जिनकी मुझे जरूरत है । उदाहरण के लिए:

class relation:
    scope_list = list()
...
d = dict()
for relation in relation_list:
    for scope_item in relation.scope_list:
        d[scope_item].append(relation)

एक विकल्प फिर जगह ले जाएगा

d[scope_item].append(relation)

साथ में

if d.has_key(scope_item):
    d[scope_item].append(relation)
else:
    d[scope_item] = [relation,]

इसे संभालने का सबसे अच्छा तरीका क्या है? आदर्श रूप से, "बस काम" करना होगा। क्या यह व्यक्त करने का कोई तरीका है कि मुझे खाली सूचियों का शब्दकोश चाहिए, भले ही मुझे सूची बनाते समय हर कुंजी का पता न हो?

जवाबों:


278

आप डिफ़ॉल्ट का उपयोग कर सकते हैं :

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> a = ['1', '2']
>>> for i in a:
...   for j in range(int(i), int(i) + 2):
...     d[j].append(i)
...
>>> d
defaultdict(<type 'list'>, {1: ['1'], 2: ['1', '2'], 3: ['2']})
>>> d.items()
[(1, ['1']), (2, ['1', '2']), (3, ['2'])]

1
collectionsमॉड्यूल के तहत अन्य शब्दकोश भी इस तरह से काम करते हैं, उदाहरण के लिए collections.OrderedDict
txsaw1

2
ओह। यह भी खूब रही। और आपको '= []' को इनिशियलाइज़ करने की ज़रूरत नहीं है। अच्छी चीज़!
विल्मर ई। हेनो

1
NameError: name 'a' is not defined
एस एंड्रयू

51

आप इसे इस तरह की सूची समझ के साथ बना सकते हैं:

>>> dict((i, range(int(i), int(i) + 2)) for i in ['1', '2'])
{'1': [1, 2], '2': [2, 3]}

और अपने प्रश्न के दूसरे भाग के लिए डिफॉल्ट का उपयोग करें

>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
        d[k].append(v)

>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

32

आप उपयोग कर सकते हैं setdefault:

d = dict()
a = ['1', '2']
for i in a:
    for j in range(int(i), int(i) + 2): 
        d.setdefault(j, []).append(i)

print d  # prints {1: ['1'], 2: ['1', '2'], 3: ['2']}

बल्कि अजीब तरह से नामित setdefaultफ़ंक्शन कहता है "इस कुंजी के साथ मान प्राप्त करें, या यदि वह कुंजी नहीं है, तो इस मान को जोड़ें और फिर इसे वापस लौटाएं।"

जैसा कि दूसरों ने सही बताया है, defaultdictएक बेहतर और आधुनिक विकल्प है। setdefaultअभी भी पाइथन के पुराने संस्करणों में उपयोगी है (2.5 से पहले)।


2
यह काम करता है, लेकिन आम तौर पर यह उपलब्ध होने पर डिफ़ॉल्ट का उपयोग करना पसंद करता है।
डेविड जेड

@ डेविड, हाँ, सेटडेफ़ॉल्ट डिजाइन का सबसे शानदार हिस्सा नहीं था, क्षमा करें - यह शायद ही कभी सबसे अच्छा विकल्प है। मुझे लगता है कि हम (पायथन कमिटर्स) ने संग्रह के साथ हमारी सामूहिक प्रतिष्ठा को भुनाया। हालांकि, हालांकि ;-)।
एलेक्स मार्टेली

@DavidZ, setdefault डिफॉल्ट से अलग है, क्योंकि यह अधिक लचीला है: अन्य रूप से, आप विभिन्न डिक्शनरी कुंजी के लिए अलग-अलग डिफ़ॉल्ट मान कैसे निर्दिष्ट करते हैं?
एलेक्स गिदान

@AlexGidan यह सच है, लेकिन इस प्रश्न के लिए विशेष रूप से प्रासंगिक नहीं है।
डेविड जेड

यह उत्तर तब भी उपयोगी होता है जब आपको ऑर्डरडीड और डिफ़ॉल्ट मान की आवश्यकता होती है।
nimcap

2

आपके प्रश्न का उत्तर पहले ही दिया जा चुका है, लेकिन IIRC आप लाइनों को बदल सकते हैं:

if d.has_key(scope_item):

साथ में:

if scope_item in d:

यही है, उस निर्माण में dसंदर्भ d.keys()। कभी-कभी defaultdictसबसे अच्छा विकल्प नहीं होता है (उदाहरण के लिए, यदि आप elseउपरोक्त के साथ जुड़े के बाद कोड की कई पंक्तियों को निष्पादित करना चाहते हैं if), और मुझे inसिंटैक्स पढ़ना आसान लगता है ।


2

व्यक्तिगत रूप से, मैं सिर्फ JSON का उपयोग चीजों को स्ट्रिंग्स और बैक में परिवर्तित करने के लिए करता हूं। स्ट्रिंग्स मैं समझता हूं।

import json
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
mydict = {}
hash = json.dumps(s)
mydict[hash] = "whatever"
print mydict
#{'[["yellow", 1], ["blue", 2], ["yellow", 3], ["blue", 4], ["red", 1]]': 'whatever'}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.