Załóżmy, że mam listę a
w języku Python, której wpisy są wygodnie mapowane na słownik. Każdy parzysty element reprezentuje klucz do słownika, a następujący nieparzysty element jest wartością
na przykład,
a = ['hello','world','1','2']
i chciałbym przekonwertować go na słownik b
, gdzie
b['hello'] = 'world'
b['1'] = '2'
Jaki jest najczystszy syntaktycznie sposób na osiągnięcie tego?
python
list
dictionary
Mikrofon
źródło
źródło
Odpowiedzi:
Jeśli
a
jest duży, prawdopodobnie będziesz chciał zrobić coś takiego, co nie tworzy tymczasowych list takich jak powyższe.W Pythonie 3 można również użyć rozumienia słownika, ale jak na ironię, myślę, że najprostszym sposobem na to jest użycie
range()
ilen()
, który normalnie byłby zapachem kodu.Ta
iter()/izip()
metoda jest więc prawdopodobnie najbardziej Pythoniczna w Pythonie 3, chociaż jak zauważa EOL w komentarzu,zip()
jest już leniwa w Pythonie 3, więc nie potrzebujeszizip()
.Jeśli chcesz to w jednej linii, będziesz musiał oszukiwać i używać średnika. ;-)
źródło
zip(i, i)
w Pythonie 3, ponieważzip()
teraz zwraca iterator.Prosta odpowiedź
Inna opcja (dzięki uprzejmości Alexa Martellego - źródło ):
Powiązana uwaga
Jeśli masz to:
i chcesz tego (każdy element listy wpisujący daną wartość (w tym przypadku 2)):
możesz użyć:
źródło
fromkeys
.>>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
W tym celu możesz dość łatwo zrozumieć:
Jest to równoważne z poniższą pętlą for:
źródło
Coś, co uważam za całkiem fajne, to znaczy, jeśli twoja lista ma tylko 2 elementy:
Pamiętaj, że dict akceptuje iterowalność zawierającą iterację, w której każdy element w iteracji musi być iterowalny z dokładnie dwoma obiektami.
źródło
Może nie być najbardziej pytoniczny, ale
źródło
enumerate
for i, key in enumerate(a[::2]):
. Wciąż mało mityczne, ponieważ konstruktor nagrań może wykonać dla ciebie większość pracyfor i, key in enumerate(a[::2]):
podejście może działać? Wynikowe wartości par byłyby0 hello
i1 1
, i nie jest dla mnie jasne, jak ich używać do produkcji{'hello':'world', '1':'2'}
.enumerate(a)[::2]
Możesz to zrobić dość szybko, bez tworzenia dodatkowych tablic, więc zadziała to nawet w przypadku bardzo dużych tablic:
Jeśli masz generator
a
, jeszcze lepiej:Oto podsumowanie:
źródło
{'hello':'hello','world':'world','1':'1','2':'2'}
)Możesz to również zrobić w ten sposób (tutaj konwersja ciągu na listę, a następnie konwersja do słownika)
źródło
Jestem również bardzo zainteresowany posiadaniem jednowierszowego do tej konwersji, o ile taka lista jest domyślnym inicjatorem haszowania w Perlu.
W tym wątku podano wyjątkowo wyczerpującą odpowiedź -
Mój, jestem nowicjuszem w Pythonie), używając wyrażeń generatora Python 2.7 , to:
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
źródło
Nie jestem pewien, czy jest to python, ale wydaje się, że działa
źródło
spróbuj poniżej kodu:
źródło
Możesz także wypróbować to podejście, zapisać klucze i wartości na innej liście, a następnie użyć metody dict
wynik:
źródło
źródło