Python-Tupel zu diktieren

149

Gibt für das Tupel t = ((1, 'a'),(2, 'b')) dict(t)zurück{1: 'a', 2: 'b'}

Gibt es einen guten Weg, um zu bekommen {'a': 1, 'b': 2}(Schlüssel und Vals getauscht)?

Letztendlich möchte ich in der Lage sein, 1gegeben 'a'oder 2gegeben zurückzukehren 'b'. Vielleicht ist die Umwandlung in ein Diktat nicht der beste Weg.

Jake
quelle

Antworten:

277

Versuchen:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}
Greg Hewgill
quelle
8
+1 Schön!, Ich musste es mit Reißverschluss versuchen dict(zip(*zip(*t)[::-1])). Dies ist langsamer, hässlicher und verbraucht viel mehr Speicher. Wahrscheinlich 3x.
Kevpie
@kevpie Das Wunderbare an Python ist, dass es hundert Möglichkeiten gibt, auszudrücken, wie man etwas macht, jede genauso interessant wie die andere.
bjd2385
Großartig, wenn Sie ein Triple haben, können Sie es tun: dict((x, y) for x, y, z in t)oder dict((x, (y, z)) for x, y, z in t)den zweiten und dritten Wert als Tupel erhalten.
Guival
Sehr schnell, umfassend und einfach. Perfekte Antwort.
Gies0r
73

Eine etwas einfachere Methode:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}
jterrace
quelle
1
Was macht das schneller?
Maazza
9
Die
Map-
1
Ich mag das, weil ich das reverseexplizit formuliert habe.
Frerich Raabe
4
@maazza: Im Allgemeinen deuten Leistungstests darauf hin, dass (zumindest in der C-Implementierung) mapschneller als ein Verständnis ist, wenn das zugeordnete Objekt eine andere integrierte Funktion (wie reversed) ist. In den meisten anderen Fällen ist das Gegenteil der Fall. Aber es ist besser zu profilieren als zu raten :)
Karl Knechtel
43

Noch prägnanter, wenn Sie mit Python 2.7 arbeiten:

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}
Autholykos
quelle
9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

Oder:

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]
Gunnarsson
quelle
Ich sehe nicht, wie dies die Frage von OP beantwortet
Luca Amerio
4

Wenn für denselben Schlüssel mehrere Werte vorhanden sind, werden diese Werte mit dem folgenden Code an eine Liste angehängt, die ihrem Schlüssel entspricht.

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]
psun
quelle
2

Hier sind einige Möglichkeiten, dies zu tun:

>>> t = ((1, 'a'), (2, 'b'))

>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}

>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
Vlad Bezden
quelle