2009-12-22 37 views

cevap

11

Python sözlükleri, yinelenen içerik içeren bir tupl verilen dict sınıfı kullanılarak oluşturulabilir. Bunu, range yerleşkesi ile birlikte kullanarak (her bir tek öğe, her öğe) öğelerin bir koleksiyonunu oluşturmak ve 'a iletmek için değerleri kullanabiliriz, böylece değerler kendilerini anahtar/değer çiftlerine dönüştürür. nihai sonuç:

dictionary = dict([(List[i], List[i+1]) for i in range(0, len(List), 2)]) 
+2

Sen daha fazla verimlilik için bir jeneratör liste anlama değiştirmek için '[]' s götürebilirdin: 'dict ((Liste [i] Liste [i + 1] aralığında i için) (0 , len (Liste), 2)) 'Bu şekilde, bir taslak haline getirildikten sonra, daha sonra atmak için bir liste oluşturmaz. –

+0

Sen benim bir hayat kurtarıcımsın, Tanrı seni korusun. Şu an iki saat boyunca çalışıyorum –

+0

Şimdi, [] py2.3 uyumluluğu için ilk önce bıraktığım şey, * ve * aynı zamanda tam tersini duyduğum gerçeği - çok küçük koleksiyonlar için liste inşaatı Jeneratörün inşa edilmesinden daha hızlı. Bu konuda daha fazla detay için meslektaşımdan sorabilirim ama mantıklı. – zzzeek

11

genişletilmiş dilim notasyonu kullanarak:

dictionary = dict(zip(List[0::2], List[1::2])) 
3

aralık tabanlı cevap basittir, ancak itertools paketini kullanarak başka bir yaklaşım mümkün var:

from itertools import izip 
dictionary = dict(izip(*[iter(List)] * 2)) 

bu Breaking Down (düzenleme: bu sefer test):

# Create instance of iterator wrapped around List 
# which will consume items one at a time when called. 
iter(List) 

# Put reference to iterator into list and duplicate it so 
# there are two references to the *same* iterator. 
[iter(List)] * 2 

# Pass each item in the list as a separate argument to the 
# izip() function. This uses the special * syntax that takes 
# a sequence and spreads it across a number of positional arguments. 
izip(* [iter(List)] * 2) 

# Use regular dict() constructor, same as in the answer by zzzeeek 
dict(izip(* [iter(List)] * 2)) 

Düzenleme: Çift düzeltilmesi için Chris Lutz' keskin gözlere çok teşekkürler.

+0

Son iki satırda yazım hatası: Son yok *] ' –

+0

Chris tarafından işaret edilen sabit yazım hatası (teşekkürler!) –

+0

Şimdi yanlış yer. 'iter (Liste) * 2' geçerli bir metrik değildir. –

0

Yinelenen girişlere sahip olduğunuz yorumlarda belirtmiştiniz. Bununla çalışabiliriz. küpe listesini üretme favori yöntemini alın ve bir for döngüye genişletmek:

from itertools import izip 

dictionary = {} 
for k, v in izip(List[::2], List[1::2]): 
    if k not in dictionary: 
     dictionary[k] = set() 
    dictionary[k].add(v) 

Ya da bir anahtar zaten başlatılmış olup olmadığını kontrol etmek zorunda kalmamak biz collections.defaultdict kullanabilirsiniz:

from itertools import izip 
from collections import defaultdict 

dictionary = defaultdict(set) 
for k, v in izip(List[::2], List[1::2]): 
    dictionary[k].add(v) 

Tüm anahtarların ayarlandığı bir sözlükle son buluruz ve kümeler değerleri içerir. Bu yine de uygun olmayabilir, çünkü sözlükler gibi kümeler çiftleri tutamaz, bu nedenle aynı değeri iki tutmak için tek bir tuşa ihtiyacınız varsa, bunu bir tuple veya bir listeye değiştirmeniz gerekir. Ama bu başlaman gerek.

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

Düşüncelerimi düşündüğüm, en basit ve en iyi şey. :) –

İlgili konular