2010-07-21 21 views
8

aşağıdaki biçimde, bir yerlerden ayrıştırılan dizeleri bir listesi var:Pythonic yolu?

[key1, value1, key2, value2, key3, value3, ...] 

Öyle gibi bu listeye dayalı bir sözlük oluşturmak istiyorum:

{key1:value1, key2:value2, key3:value3, ...} 

Sıradan for Dizin ofsetleri ile döngü muhtemelen hile yapmak, ama bu Pythonic bir yolu var mı merak ediyorum. Anlamaları listelemek ilginç görünüyor, ancak bunları bu özel probleme nasıl uygulayacağımı anlayamıyorum.

Herhangi bir fikrin var mı?

cevap

13

Deneyebilirsin:

dict(zip(l[::2], l[1::2])) 

Açıklama: Biz birinci veya her iki başlayarak iki adımlarla onları alarak, iki liste, hatta biri ve tek elemanların birine listesini bölmek ikinci eleman (yani l[::2] ve l[1::2] s). Sonra çiftlerinin bir liste halinde iki listelerine zip yerleşiğini kullanın. Son olarak, bu anahtar-değer çiftleri gelen bir sözlük oluşturmak için dict arayın.

Bu son sözlükte dahil uzayda zamanla ~4n ve ~4n vardır. o itertools receipes verilen, bu senin zip, dict beri olsa da, bir döngü daha muhtemelen daha hızlıdır ve dilimleme operatörleri

+0

ve güzel açıkladı:

tahmin etmek! – KennyDeriemaeker

0
result = dict(grouper(2, L)) 

grouper bir listede çiftleri oluşturan bir fonksiyondur C. yazılır:

dict(key,value) çiftlerinin listesini alır ve bunlardan bir dict yapar.

Ayrıca result = dict(zip(*[iter(L)]*2)) yazmak ve pavpanchekha en kısa ve mükemmel ince çözüme ek olarak

+0

'result = dict (zip (* [iter (L)] * 2))' nin çalışması garanti edilmez (zip, argümanlarının değerlendirilmesi sırasına dair herhangi bir garanti vermez). Bunun yerine “result = dict (izip (* [iter (L)] * 2))' yi kullanmalısınız, bunun yerine, doğru değerlendirme sırasını garanti eden bir açıklık modeli (!) Olmanın yanı sıra. – Duncan

+1

@Ducan: Bu (yanlış) fikri nereden buldunuz? Bkz. Http://docs.python.org/library/functions.html#zip 'izip',' zip'in yalnızca yineleyici sürümüdür. –

3
In [71]: alist=['key1', 'value1', 'key2', 'value2', 'key3', 'value3'] 

In [72]: dict(alist[i:i+2] for i in range(0,len(alist),2)) 
Out[72]: {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} 
1

:-) en okuyucuların karmaşık hale getirebileceğini, bir jeneratör ifade kullanabilirsiniz (bir liste comprehensions sadece jeneratör ifade beslenir - liste yapıcı aslında daha çok) und evrensel güçlü ekstra iyilik var: Apart gerçekten harika ve işlevsel olmaktan

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

, daha iyi bir algoritma da var: dict uygulanması especiall olmadığı sürece Y, aptal Bu l, her boyut için çok bellek tüketecektir (muhtemel bir dahili var olarak) (diğer bir deyişle ilk olarak bir bütün yeni bir liste oluşturmak yerine bir seferde bir çift işlediğinden, sabit (O) (1) boşlukta çalışır).

5

sevdiğim piton deyim görüntülemek için güzel bir fırsat: Her argüman S. zip() üzerinde aynı Yineleyicinin zip() zor hat iki argüman geçer

>>> S = [1,2,3,4,5,6] 
>>> dict(zip(*[iter(S)]*2)) 
{1: 2, 3: 4, 5: 6} 

O dan çekerek, 2 maddelik dizilerini oluşturur yineleyici her zaman zip üzerinde. dict(), daha sonra bu tuplleri bir sözlüğe dönüştürür.çok teşekkürler pavpanchekha, Tam olarak ne gerekli

S = [1,2,3,4,5,6] 

I = iter(S) 
dict(zip(I,I)) 
+1

Bu AWESOME. Büyük brownie noktaları! – katrielalex

İlgili konular