पाइथन में एक शब्दकोश में एक सूची में परिवर्तित करें


189

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

उदाहरण के लिए,

a = ['hello','world','1','2']

और मैं इसे एक शब्दकोश में बदलना चाहता हूं b, जहां

b['hello'] = 'world'
b['1'] = '2'

इसे पूरा करने के लिए सिंटैक्टली सबसे साफ तरीका क्या है?


जवाबों:


269
b = dict(zip(a[::2], a[1::2]))

यदि aबड़ा है, तो आप शायद निम्नलिखित की तरह कुछ करना चाहते हैं, जो ऊपर की तरह कोई अस्थायी सूची नहीं बनाता है।

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

पायथन 3 में आप एक तानाशाह की समझ का भी इस्तेमाल कर सकते हैं, लेकिन विडंबना यह है कि मुझे लगता है कि ऐसा करने का सबसे सरल तरीका होगा range()और len(), जो सामान्य रूप से एक कोड गंध होगा।

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

तो iter()/izip()विधि अभी भी शायद पायथन 3 में सबसे अधिक पायथोनिक है, हालांकि एक टिप्पणी में ईओएल नोट के रूप में, zip()पहले से ही पायथन 3 में आलसी है , इसलिए आपको ज़रूरत नहीं है izip()

i = iter(a)
b = dict(zip(i, i))

यदि आप इसे एक पंक्ति में चाहते हैं, तो आपको एक अर्धविराम को धोखा देना होगा और उसका उपयोग करना होगा। ;-)


9
... या बस zip(i, i), पायथन 3 में, क्योंकि zip()अब एक पुनरावृत्त रिटर्न देता है।
एरिक ओ लेबिगॉट

5
ध्यान दें कि पायथन 2.7.3 में भी व्यापक समझ है
user1438003

56

सरल उत्तर

एक अन्य विकल्प ( एलेक्स मार्टेली के सौजन्य से - स्रोत ):

dict(x[i:i+2] for i in range(0, len(x), 2))

संबंधित नोट

यदि आपके पास यह है:

a = ['bi','double','duo','two']

और आप यह चाहते हैं (सूची का प्रत्येक तत्व किसी दिए गए मान को दबाता है (इस मामले में 2)):

{'bi':2,'double':2,'duo':2,'two':2}

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

>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}

2
क्या यह केवल पायथन 3 के लिए है?
तगर

2
उपयोग करें fromkeys>>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
गदोग सेप

1
यह कुछ और कर रहा है जो सवाल पूछ रहा है।
ओज

17

आप आसानी से इस के लिए एक तानाशाही समझ का उपयोग कर सकते हैं:

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}

यह नीचे दिए गए लूप के बराबर है:

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]

10

कुछ मुझे बहुत अच्छा लगता है, जो यह है कि यदि आपकी सूची केवल 2 आइटम लंबी है:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

याद रखें, तानाशाह किसी भी प्रकार से चलने-फिरने वाले को स्वीकार नहीं करता है, जहाँ चलने योग्य में प्रत्येक वस्तु को वास्तव में अन्य वस्तुओं के साथ चलने योग्य होना चाहिए।


त्वरित और सरल एक, बस जोड़ने के लिए यदि सूची में दो से अधिक आइटम हैं तो हुकुम ([ls]) के बजाय ताना (ls) का उपयोग करें। उदाहरण के लिए यदि ls = ['a ’,, b’, d c ’, dict d’] तो तानाशाह (ls)
अंकित अंकित

1
अच्छा और चिकना। 'iterable में प्रत्येक आइटम वास्तव में दो वस्तुओं के साथ एक चलने योग्य होना चाहिए।' यहाँ महत्वपूर्ण तथ्य है।
अभिजीत

4

सबसे अजगर नहीं हो सकता है, लेकिन

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]

10
के बारे में पढ़ाenumerate
SilentGhost

5
enumerate आपको एक चरण आकार निर्दिष्ट करने की अनुमति नहीं देता है, लेकिन आप उपयोग कर सकते हैं for i, key in enumerate(a[::2]):। फिर भी बेईमान है क्योंकि तानाशाह कंस्ट्रक्टर आपके लिए यहां ज्यादातर काम कर सकता है
जॉन ला रूय

@SilentGhost, gnibbler: मेरे क्षितिज को व्यापक बनाने के लिए बहुत बहुत धन्यवाद! मैं भविष्य में इसे यथासंभव शामिल करना सुनिश्चित करूंगा!
मुहम्म

@gnibbler: क्या आप इस बारे में थोड़ा और बता सकते हैं कि for i, key in enumerate(a[::2]):दृष्टिकोण कैसे काम कर सकता है? परिणामी जोड़ी मूल्य होगा 0 helloऔर 1 1, और यह मेरे लिए स्पष्ट नहीं है कि उन्हें उत्पादन करने के लिए कैसे उपयोग किया जाए {'hello':'world', '1':'2'}
मार्टीन्यू

1
@ स्मार्टिन्यू, आप सही हैं। मुझे लगता है कि मेरा मतलब हैenumerate(a)[::2]
जॉन ला रूय

4

आप अतिरिक्त सरणियों का निर्माण किए बिना इसे बहुत तेजी से कर सकते हैं, इसलिए यह बहुत बड़ी सरणियों के लिए भी काम करेगा:

dict(izip(*([iter(a)]*2)))

यदि आपके पास एक जनरेटर है a, तो और भी बेहतर:

dict(izip(*([a]*2)))

यहाँ रंडी है:

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a tuple
dict()     #puts the tuples into key,value of the dictionary

यह समान कुंजी और मूल्य जोड़े के साथ एक शब्दकोश बना देगा ( {'hello':'hello','world':'world','1':'1','2':'2'})
मिक

नहीं, सभी ठीक काम करते हैं। कृपया अधिक ध्यान से पढ़ें। यह कहता है: "यदि आपके पास एक जनरेटर है ..." यदि आपके पास जनरेटर नहीं है, तो बस पहली पंक्ति का उपयोग करें। दूसरा एक विकल्प है जो उपयोगी होगा यदि आपके पास सूची के बजाय एक जनरेटर है, जैसा कि अधिकांश समय होगा।
टोपकारा

1

आप इसे इस तरह भी कर सकते हैं (स्ट्रिंग यहाँ रूपांतरण को सूचीबद्ध करने के लिए, फिर एक शब्दकोश में रूपांतरण)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(zip(string_list[::2],string_list[1::2]))

    print string_list

1

मुझे इस रूपांतरण के लिए वन-लाइनर रखने का भी बहुत शौक है, क्योंकि अभी तक ऐसी सूची पर्ल में हैशेड के लिए डिफ़ॉल्ट इनिशियलाइज़र है।

इस धागे में असाधारण रूप से व्यापक उत्तर दिया गया है -

मेरा एक मैं Python में नौसिखिया हूँ), Python 2.7 जेनरेटर एक्सप्रेशंस का उपयोग करते हुए , यह होगा:

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))


0

मुझे यकीन नहीं है कि यह पायथोनिक है, लेकिन काम करने लगता है

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))

0

नीचे दिए गए कोड का प्रयास करें:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}

0

आप इस दृष्टिकोण को अलग-अलग सूची में कुंजियों और मूल्यों को बचाने की कोशिश कर सकते हैं और फिर तानाशाही विधि का उपयोग कर सकते हैं

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

उत्पादन:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}

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