Python: Liste in Wörterbuch mit Indizes als Werte konvertieren

78

Ich versuche die folgende Liste zu konvertieren:

list = ['A','B','C']

Zu einem Wörterbuch wie:

dict = {'A':0, 'B':1, 'C':2}

Ich habe versucht, Antworten aus anderen Posts zu finden, die für mich nicht funktionieren. Ich habe vorerst folgenden Code:

{list[i]: i for i in range(len(list))}

Was mir diesen Fehler gibt:

unhashable type: 'list'

Jede Hilfe wird sehr geschätzt. Vielen Dank.

Ahajib
quelle
Ihr Code funktioniert für mich.
Daniel
3
1. Nicht listals Variablenname verwenden 2. enumerateWie gezeigt verwenden{j:i for i,j in enumerate(l)}
Bhargav Rao
1
Sie haben einen Fehler im Code, den Sie uns nicht gezeigt haben. Die Elemente von listsind wahrscheinlich Listen, obwohl Sie andere Fehler hätten machen können, wie das Schreiben list: istatt list[i]: i.
user2357112 unterstützt Monica
@ user2357112 Ich habe den Beitrag bearbeitet. Sie haben Recht, das macht einen großen Unterschied.
Ahajib
Seltsam, dass niemand bemerkt hat, was
passiert,

Antworten:

118

Sie können die Indizes einer Liste aus der integrierten Aufzählung abrufen . Sie müssen nur die Indexwertzuordnung umkehren und ein Wörterbuchverständnis verwenden, um ein Wörterbuch zu erstellen

>>> lst = ['A','B','C']
>>> {k: v for v, k in enumerate(lst)}
{'A': 0, 'C': 2, 'B': 1}

Ohh, und benenne niemals eine Variable zu einem eingebauten oder einem Typ.

Abhijit
quelle
16

Verwenden Sie die integrierten Funktionen dict und zip:

>>> lst = ['A','B','C']
>>> dict(zip(lst,range(len(lst))))
Florex
quelle
9

Python dictKonstruktor hat eine Fähigkeit , die Liste von zu überführen , tupleum dictmit Schlüssel als erstes Element des Tupels und Wert als zweites Element des Tupels. Um dies zu erreichen, können Sie eine eingebaute Funktion verwenden, enumeratederen Ausbeute tuplevon (index, value).

Die Anforderung der Frage ist jedoch genau umgekehrt, dh tuplesollte es sein (value, index). Dies erfordert also einen zusätzlichen Schritt, um die Tupelelemente umzukehren, bevor sie an den Diktatkonstruktor übergeben werden. Für diesen Schritt können wir Builtin verwenden reversedund es mit auf jedes Element der Liste anwendenmap

>>> lst = ['A', 'B', 'C']
>>> dict(map(reversed, enumerate(lst)))
>>> {'A': 0, 'C': 2, 'B': 1}
Sohaib Farooqi
quelle
Diese Version scheint länger zu dauern als die anderen angebotenen Lösungen
Leland Hepworth
3

Verwenden Sie nicht listals Variablennamen, da dieser von Python reserviert ist. Sie können auch nutzen enumerate.

your_list = ['A', 'B', 'C']
dict = {key: i for i, key in enumerate(your_list)}
gr1zzly be4r
quelle
1
Warum benutzt du nicht den Gegenstand deiner for-Schleife?
Daniel
Weil du nicht musst. Ich habe es immer noch geändert.
gr1zzly be4r
0

Sie müssen die nicht zerlegbare Liste in ein Tupel konvertieren:

dct = {tuple(key): idx for idx, key in enumerate(lst)}
Daniel
quelle