2011-01-01 20 views
122

Python adlı, bir girdinin kolayca bir sözlükle eşleştirdiği bir listemiz var a diyelim. Her hatta eleman sözlüğe anahtarını temsil eder ve aşağıdaki garip öğe değeri örneğinPython 'da sözlüğe bir listeye dönüştürme

olduğu

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

ve ben bir sözlüğe b,

b['hello'] = 'world' 
b['1'] = '2' 
dönüştürmek istiyorum

Bunu gerçekleştirmenin sözdizimsel en temiz yolu nedir? a büyükse

+0

Olası yinelenen (https://stackoverflow.com/questions/2597166/make-dictionary-from-list-with [python ile listeden sözlüğü olun] -python) –

cevap

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

, muhtemelen yukarıdaki gibi herhangi bir geçici listeleri yapmaz aşağıdaki gibi bir şey yapmak isteyecektir.

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

Python 3 de dict anlama kullanabilirsiniz, ancak ironik ben normalde bir kod koku olurdu range() ve len(), birlikte olacak yapmanın en kolay yolu düşünüyorum. EOL yorumunda belirttiği gibi, zip() yüzden izip() gerekmez zaten Python 3'te tembel olmasına rağmen

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

Yani iter()/izip() yöntem, muhtemelen hala Python 3 en Pythonic olduğunu.

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

Tek satırda isterseniz, bir noktalı virgülü almanız ve kullanmanız gerekir.;-)

+2

… ya da basitçe zip() 'dır, zira zip()' artık bir yineleyici döndürür. – EOL

+4

Not: Python 2.7.3'ün aynı zamanda ['enumerate'] hakkında bilgi edinmek için – user1438003

3

en pythonic olmayabilir, ama

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

dict okuduğunu unutmayın (http://docs.python.org/library/functions.html#enumerate) – SilentGhost

+5

numaralandırma, bir adım boyutu belirtmenize izin vermez ama ben 'i, anahtar numarada (bir [:: 2]) kullanabilirsiniz: '. Dict kurucusunun işin çoğunu burada yapabilmeniz için hâlâ terbiyesizsiniz. –

+0

@SilentGhost, gnibbler: ufkumu genişletmek için çok teşekkürler! Gelecekte olabildiğince fazla dahil ettiğinizden emin olacağım! – sahhhm

33

Diğer bir seçenek (Alex Martelli https://stackoverflow.com/a/2597178/104264 izniyle):

a = ['bi','double','duo','two'] 
: Ayrıca bu varsa

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

ve bunu istiyorsanız (listenin her bir öğesi belirli bir değeri tuşlayarak (bu durumda 2)):

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

kullanabilirsiniz:

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

en iyi cevap anlamına geldiğini düşünüyorum. Teşekkürler – ucefkh

+1

Mükemmel, teşekkürler! –

+1

Bu sadece Python 3 için mi? – Tagar

0

emin değilim bu pythonic olmakla Python

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

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

iş gibi görünüyor çok basit eğer:

dict(a) 
+4

ben don ' Bu işe yarıyor. – Mike

12

Bir dict anlaşması için kullanabilirsiniz. r bu oldukça kolay:

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

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

Bu aşağıda döngü eşdeğerdir: Ayrıca, (a sözlüğe, burada dönüşüm listelemek için dize ardından dönüşüm) böyle yapabiliriz

my_dict = {} 
for index, item in enumerate(a): 
    if index % 2 == 0: 
     my_dict[item] = a[index+1] 
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

Ayrıca, bu dönüşüm için bir tek linere sahip olmakla çok ilgileniyorum, çünkü böyle bir liste Perl'e hashed için varsayılan başlatıcıdır.

Son derece kapsamlı cevap bu parçacığı verilmiştir -

Mayın biri I) Python deneyimsizim, Python 2.7 Generator Expressions kullanarak, şöyle olacaktır:

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

5

Oldukça harika bulduğum bir şey, yani listeniz sadece 2 öğe ise uzun s:

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

hatırla

, dict iterable her öğe kendisi tam iki nesnelerle bir iterable olması gereken bir iterable içeren herhangi iterable kabul eder.

+0

hızlı ve basit, sadece listenin ikiden fazla öğe içeriyorsa eklemek için dict (ls) yerine dict (ls) kullanın. örneğin ls = ['a', 'b', 'c', 'd'] ise, dict (ls) –

3

Fazladan diziler yaratmadan oldukça hızlı yapabilir, bu nedenle bu hatta çok büyük diziler için çalışacak:

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

Eğer bir jeneratör a varsa, hatta daha iyi:

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

İşte yıkık:

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 
-1
#work~ 
` 
a = ['Openstack','Puppet','Python'] 
b = {} 
c = 0 
for v in a: 
    b[v] = c 
    c+=1 
print b 
kodunun altına

`

+1

Bu, soruyu sorduğu şey değil. – cpburnz

0

deneyin: bir

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