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

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


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}

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}

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

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}

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)

1
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
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.