सूची समझ के साथ एक शब्दकोश बनाएँ


1276

मुझे पायथन लिस्ट कॉम्प्रिहेंशन सिंटैक्स पसंद है।

क्या इसका इस्तेमाल शब्दकोशों बनाने के लिए भी किया जा सकता है? उदाहरण के लिए, कुंजियों और मानों के जोड़े पर पुनरावृति करके:

mydict = {(k,v) for (k,v) in blah blah blah}  # doesn't work

संबंधित: collections.Counterचीजों की गिनती के लिए एक विशेष प्रकार का
तानाशाही है:

जवाबों:


1895

पायथन 2.7 और 3 के बाद से, आपको बस संक्षिप्त समझ वाक्यविन्यास का उपयोग करना चाहिए :

{key: value for (key, value) in iterable}

पायथन 2.6 और उससे पहले के dictबिल्ट-इन में कुंजी / मूल्य जोड़े का एक पुनरावृत्ति प्राप्त हो सकता है, इसलिए आप इसे एक सूची समझ या जनरेटर अभिव्यक्ति पास कर सकते हैं। उदाहरण के लिए:

dict((key, func(key)) for key in keys)

हालाँकि, यदि आपके पास पहले से ही कुंजियाँ और / या वैल की चलने-फिरने की क्षमता है, तो आपको बिल्कुल भी समझ की ज़रूरत नहीं है - यह सबसे आसान है, dictबिल्ट-इन सीधे कॉल :

# consumed from any iterable yielding pairs of keys/vals
dict(pairs)

# "zipped" from two separate iterables of keys/vals
dict(zip(list_of_keys, list_of_values))

1
क्या होगा अगर मेरे पास शब्दों की सूची का मामला है ['बिल्ली', 'कुत्ता', 'बिल्ली'] और मैं गिनती के रूप में शब्द और मूल्य के साथ कुंजी बनाना चाहता हूं? क्या इसके लिए एक छोटा कुशल वाक्यविन्यास है?
क्रंदनभु

@cryanbhu क्या आपका मतलब है सूची में दिए गए तत्व की पुनरावृत्ति गिनती करने के लिए है अगर, वहाँ संग्रह पैकेज में एक काउंटर वर्ग है: docs.python.org/2/library/collections.html#collections.Counter
fortran


57

वास्तव में, यदि आपको पहले से ही किसी प्रकार के मानचित्रण की आवश्यकता है, तो इसे चलने योग्य से अधिक पुनरावृति की आवश्यकता नहीं है।

>>> ts = [(1, 2), (3, 4), (5, 6)]
>>> dict(ts)
{1: 2, 3: 4, 5: 6}
>>> gen = ((i, i+1) for i in range(1, 6, 2))
>>> gen
<generator object <genexpr> at 0xb7201c5c>
>>> dict(gen)
{1: 2, 3: 4, 5: 6}


32

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

मुझे पायथन लिस्ट कॉम्प्रिहेंशन सिंटैक्स पसंद है।

क्या इसका इस्तेमाल शब्दकोशों बनाने के लिए भी किया जा सकता है? उदाहरण के लिए, कुंजियों और मानों के जोड़े पर पुनरावृति करके:

mydict = {(k,v) for (k,v) in blah blah blah}

आप वाक्यांश "तानाशाह समझ" की तलाश कर रहे हैं - यह वास्तव में है:

mydict = {k: v for k, v in iterable}

मान blah blah blahलेना दो-टुपल्स का एक चलना है - आप इतने करीब हैं। आइए कुछ "ब्लाह" बनाएं जैसे:

blahs = [('blah0', 'blah'), ('blah1', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]

डिक्ट कॉम्प्रिहेंशन सिंटैक्स:

अब यहाँ सिंटेक्स मैपिंग भाग है। क्या यह एक dictसमझ के बजाय एक समझ बनाता है set(जो कि आपका छद्म कोड सन्निकट है) बृहदान्त्र है, :जैसे:

mydict = {k: v for k, v in blahs}

और हम देखते हैं कि यह काम किया है, और अजगर के 3.7 के रूप में प्रविष्टि क्रम बनाए रखना चाहिए:

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah2': 'blah', 'blah3': 'blah'}

पायथन 2 में और 3.6 तक, ऑर्डर की गारंटी नहीं थी:

>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah3': 'blah', 'blah2': 'blah'}

फ़िल्टर जोड़ना:

सभी समझ में एक मैपिंग घटक और एक फ़िल्टरिंग घटक है जो आप मनमाने ढंग से अभिव्यक्ति प्रदान कर सकते हैं।

तो आप अंत में एक फ़िल्टर भाग जोड़ सकते हैं:

>>> mydict = {k: v for k, v in blahs if not int(k[-1]) % 2}
>>> mydict
{'blah0': 'blah', 'blah2': 'blah'}

यहां हम केवल इस बात के लिए परीक्षण कर रहे हैं कि क्या कुंजी और मानों को मैप करने से पहले डेटा को फ़िल्टर करने के लिए अंतिम वर्ण 2 से विभाज्य है।


23

पायथन संस्करण <2.7 (आरआईपी, 3 जुलाई 2010 - 31 दिसंबर 2019) , नीचे करें:

d = dict((i,True) for i in [1,2,3])

पायथन संस्करण> = 2.7, नीचे करें:

d = {i: True for i in [1,2,3]}

22

@ फोरट्रान के उत्तर को जोड़ने के लिए, यदि आप कुंजियों की सूची के key_listसाथ-साथ मानों की सूची पर पुनरावृति करना चाहते हैं value_list:

d = dict((key, value) for (key, value) in zip(key_list, value_list))

या

d = {(key, value) for (key, value) in zip(key_list, value_list)}

6

डिक्शनरी कॉम्प्रिहेंशन का उपयोग करते हुए शब्दकोश निर्माण का एक और उदाहरण है:

मैं यहाँ क्या करने के लिए ट्रिंग कर रहा हूँ एक वर्णमाला शब्दकोश बनाने के लिए जहां प्रत्येक जोड़ी; अंग्रेजी अक्षर और अंग्रेजी वर्णमाला में इसकी संबंधित स्थिति है

>>> import string
>>> dict1 = {value: (int(key) + 1) for key, value in 
enumerate(list(string.ascii_lowercase))}
>>> dict1
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 
'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 
19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
>>> 

सूची में अल्फाबेट्स और उनके अनुक्रमों की सूची प्राप्त करने के लिए यहां एन्यूमरेट के उपयोग की सूचना दें और शब्दकोश के लिए प्रमुख मूल्य युग्म उत्पन्न करने के लिए अक्षर और सूचकांकों की अदला-बदली करें।

आशा है कि यह आपके लिए शब्दकोश का एक अच्छा विचार देता है और आपको अपने कोड को कॉम्पैक्ट बनाने के लिए इसे अधिक बार उपयोग करने के लिए प्रोत्साहित करता है


1
अच्छा जवाब - सरलीकृत:d = {k: v+1 for v, k in enumerate(string.ascii_lowercase)}
जॉन्नीदराम

4

इसे इस्तेमाल करे,

def get_dic_from_two_lists(keys, values):
    return { keys[i] : values[i] for i in range(len(keys)) }

मान लें कि हमारे पास दो सूचियाँ हैं देश और राजधानी

country = ['India', 'Pakistan', 'China']
capital = ['New Delhi', 'Islamabad', 'Beijing']

फिर दो सूचियों से शब्दकोश बनाएं:

print get_dic_from_two_lists(country, capital)

आउटपुट इस तरह है,

{'Pakistan': 'Islamabad', 'China': 'Beijing', 'India': 'New Delhi'}

9
आप ज़िप का उपयोग कर सकते हैं
आंद्रे साइमन

2
>>> {k: v**3 for (k, v) in zip(string.ascii_lowercase, range(26))}

पायथन तानाशाह की समझ का समर्थन करता है, जो आपको इसी तरह संक्षिप्त वाक्य रचना का उपयोग करके रनटाइम पर शब्दकोशों के निर्माण को व्यक्त करने की अनुमति देता है।

एक शब्दकोश समझ के रूप में {key: value for (key, value) iterable} लेता है। इस सिंटैक्स को पायथन 3 में पेश किया गया था और जहाँ तक इसे पायथन 2.7 के रूप में देखा गया है, इसलिए आपको इसका उपयोग करने में सक्षम होना चाहिए, भले ही आपने पायथन के किस संस्करण को स्थापित किया हो।

एक विहित उदाहरण दो सूचियों को ले रहा है और एक शब्दकोश बना रहा है जहां पहली सूची में प्रत्येक स्थिति में आइटम एक कुंजी बन जाता है और दूसरी सूची में संबंधित स्थान पर आइटम मूल्य बन जाता है।

इस समझ के अंदर उपयोग किया गया ज़िप फ़ंक्शन ट्यूपल्स का एक पुनरावर्तक देता है, जहां ट्यूपल में प्रत्येक तत्व प्रत्येक इनपुट पुनरावृत्तियों में एक ही स्थिति से लिया जाता है। ऊपर दिए गए उदाहरण में, दिए गए पुनरावृत्ति में टुपल्स ("ए", 1), ("बी", 2), आदि शामिल हैं।

आउटपुट:

{{मैं ’: ५१२, 'ई’: ६४,: ओ ’: २'४४,: एच’: ३४३, 31 एल ’: १३३१,' एस’: 5832, 'बी ’: 1,, डब्ल्यू’: 10648, ’ c ': 8,' x ': 12167,' y ': 13824,' t ': 6859,' p ': 3375,' d ': 27,' j ': 729,' a ': 0,' z ' : 15625, 'f': 125, 'q': 4096, 'u': 8000, 'n': 2197, 'm': 1728, 'r': 4913, 'k': 1000, 'g': 216 , 'v': 9261}


2

यह कोड विभिन्न मूल्यों के साथ कई सूचियों के लिए सूची बोध का उपयोग करके शब्दकोश बनाएगा जिसका उपयोग किया जा सकता है pd.DataFrame()

#Multiple lists 
model=['A', 'B', 'C', 'D']
launched=[1983,1984,1984,1984]
discontinued=[1986, 1985, 1984, 1986]

#Dictionary with list comprehension
keys=['model','launched','discontinued']
vals=[model, launched,discontinued]
data = {key:vals[n] for n, key in enumerate(keys)}

enumerateअपनी सूची के साथ प्रत्येक मैच के nलिए पास होगाvalskey


1

बस एक और उदाहरण में फेंकने के लिए। कल्पना करें कि आपके पास निम्नलिखित सूची है:

nums = [4,2,2,1,3]

और आप इसे एक श्रुतलेख में बदलना चाहते हैं जहां कुंजी सूचकांक है और सूची में मूल्य तत्व है। आप निम्न लाइन कोड के साथ ऐसा कर सकते हैं:

{index:nums[index] for index in range(0,len(nums))}

0

आप प्रत्येक जोड़ी के लिए एक नया तानाशाह बना सकते हैं और इसे पिछले ताना के साथ मिला सकते हैं:

reduce(lambda p, q: {**p, **{q[0]: q[1]}}, bla bla bla, {})

जाहिर है कि इस दृष्टिकोण की आवश्यकता reduceहै functools


एक ही विचार: कम करें (लंबोदर पी, क्यू: {** पी, ** तानाशाह ([q])}, bla bla bla, {})
महमूद खालिद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.