tupla de pitón para dictar

149

Para la tupla, t = ((1, 'a'),(2, 'b')) dict(t)vuelve{1: 'a', 2: 'b'}

¿Hay una buena manera de obtener {'a': 1, 'b': 2}(llaves y vals intercambiados)?

En última instancia, quiero poder regresar 1dado 'a'o 2dado 'b', tal vez la conversión a un dict no sea la mejor manera.

Jake
fuente

Respuestas:

277

Tratar:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}
Greg Hewgill
fuente
8
+1 ¡Hermoso !, tuve que probarlo con zip dict(zip(*zip(*t)[::-1])). Esto es más lento, más feo y usa mucha más memoria ... probablemente 3x.
kevpie
@kevpie Lo maravilloso de Python es que hay cientos de formas de expresar cómo hacer algo, cada una tan interesante como la siguiente.
bjd2385
Genial, si lo que tienes es un triple que puedes hacer: dict((x, y) for x, y, z in t)u dict((x, (y, z)) for x, y, z in t)obtener el segundo y tercer valor como una tupla.
guival
Muy rápido, completo y sencillo. Respuesta perfecta.
gies0r
73

Un método un poco más simple:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}
jterrace
fuente
1
¿Qué hace esto más rápido?
maazza
9
Las funciones map y dict se implementan en C y son mucho más rápidas que cualquier versión de Python
jterrace
1
Me gusta esto por haber reverseexplicado explícitamente.
Frerich Raabe
44
@maazza: en general, las pruebas de rendimiento sugieren que (al menos en la implementación de C) mapes más rápido que una comprensión cuando lo que se está mapeando es otra función incorporada (como reversed); en la mayoría de los otros casos, lo contrario es cierto. Pero es mejor perfilar que adivinar :)
Karl Knechtel
43

Aún más conciso si estás en Python 2.7:

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

O:

>>> [ 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
fuente
No veo cómo esto responde la pregunta de OP
Luca Amerio
4

Si hay varios valores para la misma clave, el siguiente código agregará esos valores a una lista correspondiente a su clave,

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

Aquí hay dos formas de hacerlo:

>>> 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
fuente