2013-02-11 16 views

Odpowiedz

12

Nie twórz zmiennych o dynamicznej nazwie. Utrudnia to programowanie z nimi. Zamiast tego należy użyć dict:

x = [100,2,300,4,75] 
dct = {} 
for i in x: 
    dct['lst_%s' % i] = [] 

print(dct) 
# {'lst_300': [], 'lst_75': [], 'lst_100': [], 'lst_2': [], 'lst_4': []} 
+0

Czy istnieje sposób, aby zrobić z zachowując kolejność oryginalnego X? Zamiast tego widzę tutaj iw odpowiedzi root'a, że ​​zamówienie "100, 2, 300, 4, 75" nie zostało zachowane. Wyobrażam sobie, że to jakaś własność dyktatorska. – Coolio2654

+0

@ Coolio2654: Racja. Klucze 'dict' nie są zamawiane. Aby zachować kolejność włożonych kluczy, użyj ['collections.OrderedDict'] (https://docs.python.org/2/library/collections.html#collections.OrderedDict): (zmień' dct = { } '->' importuj kolekcje', a następnie 'dct = collections.OrderedDict()'). – unutbu

5

użyć słownika do przechowywania list:

In [8]: x = [100,2,300,4,75] 

In [9]: {i:[] for i in x} 
Out[9]: {2: [], 4: [], 75: [], 100: [], 300: []} 

Aby uzyskać dostęp do każdego listę:

In [10]: d = {i:[] for i in x} 

In [11]: d[75] 
Out[11]: [] 

A jeśli naprawdę chcesz mieć lst_ w każdym etykieta:

In [13]: {'lst_{}'.format(i):[] for i in x} 
Out[13]: {'lst_100': [], 'lst_2': [], 'lst_300': [], 'lst_4': [], 'lst_75': []} 
+0

To była moja pierwsza myśl, po prostu idź do niej pierwszy: P –

+1

@ F3AR3DLEGEND - Myślę, że jest to najbardziej pytoniczny sposób na zrobienie tego :) – root

+0

Czy to jest * zrozumienie słownika *? :-) –

0

Lekką odmianą rozwiązań dyktowanych przez innych jest użycie defaultdict. Pozwala pominąć krok inicjalizacji, wywołując domyślną wartość wybranego typu.

W tym przypadku wybrany typ jest wykaz, który daje pustych list w słowniku:

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> d[100] 
[]