¿Cómo puedo convertir un diccionario en una lista de tuplas?

219

Si tengo un diccionario como:

{ 'a': 1, 'b': 2, 'c': 3 }

¿Cómo puedo convertirlo a esto?

[ ('a', 1), ('b', 2), ('c', 3) ]

¿Y cómo puedo convertirlo a esto?

[ (1, 'a'), (2, 'b'), (3, 'c') ]
Miguel
fuente
77
[tuple(reversed(x)) for x in d.items()]
garej
1
@garej: Dado xque ya está tupleen su código (es la naturaleza de itemsproducir un iterable de tuples), sería más simple / rápido hacerlo [x[::-1] for x in d.items()]; el corte inverso construye directamente un inverso tupledel tamaño adecuado en lugar de hacer que el tupleconstructor se complete de forma iterativa (con sobreasignación y cambio de tamaño al final) a tupledesde un reversediterador.
ShadowRanger
@ShadowRanger, tienes razón. Solo quería ser explícito de que no siempre es necesario un k, vpatrón en tales casos.
garej
Nota:compatibility etiqueta agregada debido a las diferencias py2.x // py3.x
dreftymac

Respuestas:

360
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]

No está en el orden que desea, pero los dictados no tienen ningún orden específico de todos modos. 1 Ordénelo u organícelo según sea necesario.

Ver: artículos () , iteritems ()


En Python 3.x, no usaría iteritems(que ya no existe), sino que usaría items, que ahora devuelve una "vista" en los elementos del diccionario. Consulte el documento Novedades para Python 3.0 y la nueva documentación sobre vistas .

1: Se agregó la preservación del orden de inserción para los dictos en Python 3.7

Devin Jeanpierre
fuente
8
items () devuelve una vista dict_keys en python3. Envuelva esta llamada con un elenco a una lista "list ()". Ver la respuesta de @ SilentGhost
Erich
55

como nadie más lo hizo, agregaré versiones de py3k:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]
SilentGhost
fuente
18

Puedes usar listas de comprensión.

[(k,v) for k,v in a.iteritems()] 

te atrapará [ ('a', 1), ('b', 2), ('c', 3) ]y

[(v,k) for k,v in a.iteritems()] 

El otro ejemplo.

Lea más sobre las comprensiones de listas si lo desea, es muy interesante lo que puede hacer con ellas.

mpeterson
fuente
10

Crea una lista de tuplas nombradas

A menudo puede ser muy útil usar namedtuple . Por ejemplo, tiene un diccionario de 'nombre' como claves y 'puntaje' como valores como:

d = {'John':5, 'Alex':10, 'Richard': 7}

Puede enumerar los elementos como tuplas, ordenados si lo desea, y obtener el nombre y la puntuación de, digamos, el jugador con la puntuación más alta (índice = 0) muy pitónicamente de esta manera:

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

Como hacer esto:

listar en orden aleatorio o mantener el orden de las colecciones .

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

en orden, ordenados por valor ('puntuación'):

import collections
Player = collections.namedtuple('Player', 'score name')

ordenados con el puntaje más bajo primero:

worst = sorted(Player(v,k) for (k,v) in d.items())

ordenados con el puntaje más alto primero:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
Remi
fuente
7

Lo que queremos es dict's items()y iteritems()métodos. itemsdevuelve una lista de tuplas (clave, valor). Como las tuplas son inmutables, no se pueden revertir. Por lo tanto, debe iterar los elementos y crear nuevas tuplas para obtener las tuplas invertidas (valor, clave). Para la iteración, iteritemses preferible ya que utiliza un generador para producir las tuplas (clave, valor) en lugar de tener que mantener toda la lista en la memoria.

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>> 
Barry Wark
fuente
6
[(k,v) for (k,v) in d.iteritems()]

y

[(v,k) for (k,v) in d.iteritems()]
Robert Rossney
fuente
77
"[(k, v) para (k, v) en d.iteritems ()]" es un terrible equivalente a d.items ()
Devin Jeanpierre
5

Estos son los cambios importantes de Python 3.xy Python 2.x

Para uso de Python3.x

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

Para uso de Python 2.7

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)
Tessaracter
fuente
4
>>> a = {'a': 1, 'b': 2, 'c': 3}

>>> [(x, a [x]) para x en a.keys ()]
[('a', 1), ('c', 3), ('b', 2)]

>>> [(a [x], x) para x en a.keys ()]
[(1, 'a'), (3, 'c'), (2, 'b')]
ismail
fuente
4

Por keys() y values()métodos de diccionario y zip.

zip devolverá una lista de tuplas que actúa como un diccionario ordenado.

Manifestación:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]
Vivek Sable
fuente
Esto funcionó para mí como una alternativa a collections.OrderedDict()eso funciona mejor con múltiples versiones de Python HTTP Requests lib. Aunque no me gusta el zipnombre de la función como algo vago / sobrecargado.
MarkHu
Tenga en cuenta que la zip-ificación no es un casting "profundo", es decir, si hay hijos anidados, no se verán afectados. Puede que tenga que rodar su propia recursión.
MarkHu
3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list
Harish
fuente
2
Aunque este código puede ayudar a resolver el problema, no explica por qué y / o cómo responde la pregunta. Proporcionar este contexto adicional mejoraría significativamente su valor educativo a largo plazo. Por favor, editar su respuesta para agregar explicación, incluyendo lo que se aplican limitaciones y supuestos.
Toby Speight
3

Una más simple sería

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

El segundo no es más simple pero sí.

Ketan
fuente