Wie konvertiere ich eine Liste von Schlüsselwert-Tupeln in ein Wörterbuch?

125

Ich habe eine Liste, die aussieht wie:

[('A', 1), ('B', 2), ('C', 3)]

Ich möchte daraus ein Wörterbuch machen, das so aussieht:

{'A': 1, 'B': 2, 'C': 3}

Was ist der beste Weg, um dies zu erreichen?

EDIT: Meine Liste der Tupel ist eigentlich eher wie:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]
Fred Wilson
quelle
1
Was für Entitäten Asind das B(oder BERA) und C(oder CE) wirklich? Danke
essen
Ich bin bereit zu wetten, dass die Fehler, die mit den folgenden Arbeitsbeispielen erzeugt wurden, damit zusammenhängen, dass er keine Liste von Tupeln hat, sondern eine extrem lange Liste, die er in zwei Tupel aufteilen möchte.
GDDC

Antworten:

90

Dies gibt mir den gleichen Fehler wie der Versuch, die Liste aufzuteilen und zu komprimieren. ValueError: Das Wörterbuchaktualisierungssequenzelement # 0 hat die Länge 1916; 2 ist erforderlich

DAS ist deine eigentliche Frage.

Die Antwort ist, dass die Elemente Ihrer Liste nicht so sind, wie Sie denken. Wenn Sie eingeben, werden myList[0]Sie feststellen, dass das erste Element Ihrer Liste kein Zwei-Tupel ist, z. B. ('A', 1)ein iterierbares Element von 1916.

Sobald Sie tatsächlich eine Liste in der Form haben, die Sie in Ihrer ursprünglichen Frage ( myList = [('A',1),('B',2),...]) angegeben haben, müssen Sie nur noch tun dict(myList).

Ninjagecko
quelle
Danke, ich weiß nicht, wie die Liste so entstanden ist, aber nachdem ich sie von Grund auf überarbeitet hatte, konnte ich sie reparieren.
Fred Wilson
1
@DJ_Stuffy_K: (vorausgesetzt, der Kontext hat nichts mit dieser Frage zu tun) Im Allgemeinen ist es vollkommen in Ordnung, Diktate als hilfreiche Indizes für jede abstrakte Datenstruktur zu erstellen, die Sie implizit erstellen, es sei denn, dies ist überflüssig oder verlangsamt Ihr Programm. Der Begriff "gute Praxis" ist völlig kontextabhängig; Benötigen Sie eine O (1) Suchzeit für Schlüssel? Sie können Listen auch nicht willkürlich "in Wörterbücher konvertieren". es hängt ganz von der Semantik ab. zB [(1,2), (1,3)]-> {1:3}würde deine Schlüssel verstopfen und Infos verlieren! Ein Diktat ist eine Eins-zu-*-Beziehung zur Einfüge- / Löschzeit von O (1). Liste ist eine Liste.
Ninjagecko
162
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}
Andreas Jung
quelle
5
Kommentierte auch eine andere Antwort, die dasselbe vorschlägt: Dies gilt nicht für doppelte Tupelschlüssel, z. B.: l=[('A',1), ('B',2), ('C',3), ('A', 2)]Führt dazu, 'A': 1dass möglicherweise nicht das gewünschte Ergebnis erzielt wird.
Guival
32

Hast du das versucht?

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}
Nutzlos
quelle
ValueError: Das Wörterbuchaktualisierungssequenzelement # 0 hat die Länge 1916; 2 ist erforderlich
Fred Wilson
Das war ein direkter Cut'n'Paste von meinem Terminal, also sollte es funktionieren. Können Sie genau zeigen, was Sie getan haben, um diesen Fehler zu erhalten?
Nutzlos
@Fred, du musst etwas falsch geschrieben haben, diese Antwort ist in Ordnung.
Martineau
@FredWilson, das ist der Fehler, den Sie normalerweise erhalten, wenn Sie etwas wie versuchendict([string1, string2, string3, string4])
chacham15
2
Dies gilt nicht für doppelte Tupelschlüssel, z. B.: l=[('A',1), ('B',2), ('C',3), ('A', 2)]Führt dazu, 'A': 1dass möglicherweise nicht das gewünschte Ergebnis erzielt wird.
Guival
10

Hier ist eine Möglichkeit, mit doppelten Tupel- "Schlüsseln" umzugehen:

# An example
l = [('A', 1), ('B', 2), ('C', 3), ('A', 5), ('D', 0), ('D', 9)]

# A solution
d = dict()
[d [t [0]].append(t [1]) if t [0] in list(d.keys()) 
 else d.update({t [0]: [t [1]]}) for t in l]
d

OUTPUT: {'A': [1, 5], 'B': [2], 'C': [3], 'D': [0, 9]}
Tam Le
quelle
Genial! Hat mir geholfen.
unpaarig gut
großartig!, hat viel geholfen
Athar
2

Ein anderer Weg, Wörterbuchverständnisse zu verwenden,

>>> t = [('A', 1), ('B', 2), ('C', 3)]
>>> d = { i:j for i,j in t }
>>> d
{'A': 1, 'B': 2, 'C': 3}
Arun
quelle
2

Wenn Tuple keine Tastenwiederholungen hat, ist es einfach.

tup = [("A",0),("B",3),("C",5)]
dic = dict(tup)
print(dic)

Wenn das Tupel Tastenwiederholungen hat.

tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = {}
for i, j in tup:
    dic.setdefault(i,[]).append(j)
print(dic)
Syed Muhammad Zafar Rizvi
quelle
1
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
Ein Mann
quelle