2011-05-31 12 views
6

Mam listę, której chcę użyć jako kluczy do słownika i listy krotek z wartościami. Rozważmy następujący:Słownik w języku Python z listą jako klucze i krotek jako wartości

d = {} 
l = ['a', 'b', 'c', 'd', 'e'] 
t = [(1, 2, 3, 4), (7, 8, 9, 10), (4, 5, 6, 7), (9, 6, 3, 8), (7, 4, 1, 2)] 

for i in range(len(l)): 
    d[l[i]] = t[i] 

Lista będzie konsekwentnie będzie 5 wartości i konsekwentnie będzie wynosić 5 krotki jednak istnieją setki tysięcy wartości w każdej krotki.

Moje pytanie brzmi: jaki jest NAJSZYBSZY sposób zapełniania słownika, d, krotkami wt, z kluczami będącymi wartościami w l?

Odpowiedz

17

robiłem żadnych pomiarów czasu, ale prawdopodobnie

d = dict(zip(l, t)) 

będzie dość dobra. W przypadku tylko 5 par klucz-wartość nie sądzę, aby izip() zapewniał jakąkolwiek przewagę nad zip(). Fakt, że każda krotka ma wiele elementów, nie ma znaczenia dla tej operacji, ponieważ obiekty krotki nie są kopiowane w żadnym punkcie, ani z twoim podejściem, ani z moim. Tylko wskaźniki do obiektów krotki są wstawiane do tego dictonary.

9

Aby zbudować na Sven's answer, za pomocą itertools.izip byłaby szybsza i zużywa mniej pamięci, jeśli potrzebujesz stworzyć większy dict. Tylko z pięcioma parami klucz/wartość czas budowy dict będzie minimalny.

python -m timeit -s "l = l2 = range(100000)" "dict(zip(l, l2))" 
1000 loops, best of 3: 20.1 msec per loop 
python -m timeit -s "import itertools; l = l2 = range(100000)" "dict(itertools.izip(l, l2))" 
1000 loops, best of 3: 9.59 msec per loop 
+1

Te czasy używają więcej niż 5 par klucz-wartość, więc nie jestem zaskoczony różnicą. W przypadku tylko 5 par klucz-wartość różnica będzie nieistotna. (Przy okazji, +1 za rzeczywiste mierzenie zamiast zgadywania!) –

+0

@Sven To dobry punkt. Za pomocą tylko 5 par klucz-wartość, prędkość będzie malejąca w każdym kierunku. – zeekay

Powiązane problemy