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.

Respuestas:


277

Tratar:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}

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}

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}

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

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]

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}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.