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.


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.


16

Verwenden Sie die integrierten Funktionen dict und zip:

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

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}

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)}

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)}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.