¿Cómo puedo convertir un diccionario en una lista de tuplas?
-
21-08-2019 - |
Pregunta
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') ]
Solución
>>> 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 desee, pero predice no tienen ningún orden específico de todos modos. 1 Clasificar u organizarla según sea necesario.
Ver: artículos () , iteritems ()
En Python 3.x, que no se usará iteritems
(que ya no existe), pero en lugar de utilizar items
, que ahora vuelve una "vista" en los elementos del diccionario. Ver la Novedades documento para Python 3.0, y la nueva documentación rel="noreferrer"> .
1: preservación de inserción orden para dicts era añadido en Python 3.7
Otros consejos
ya que ningún otro ha hecho, voy a añadir versiones 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')]
Puede utilizar listas por comprensión.
[(k,v) for k,v in a.iteritems()]
te conseguiré [ ('a', 1), ('b', 2), ('c', 3) ]
y
[(v,k) for k,v in a.iteritems()]
el otro ejemplo.
Leer más sobre listas por comprensión Si quieres, es muy interesante lo que puedes hacer con ellos.
Crear una lista de namedtuples
A menudo puede ser muy útil para usar namedtuple . Por ejemplo, usted tiene un diccionario de 'nombre' como claves y 'puntuación' como valores como:
d = {'John':5, 'Alex':10, 'Richard': 7}
Se pueden listar los artículos como tuplas, clasificadas si se quiere, y obtener el nombre y la puntuación de, digamos que el jugador con la puntuación más alta (índice = 0) muy Pythonically como esto:
>>> player = best[0]
>>> player.name
'Alex'
>>> player.score
10
¿Cómo hacer esto:
lista en orden aleatorio o el orden de collections.OrderedDict :
import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())
en orden, clasificado por valor ( 'puntuación'):
import collections
Player = collections.namedtuple('Player', 'score name')
ordenados con la puntuación más baratos primero:
worst = sorted(Player(v,k) for (k,v) in d.items())
clasificado con mayor puntuación en primer lugar:
best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
lo que quieres es dict
's items()
y iteritems()
métodos. items
devuelve 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 iteración, iteritems
es preferible ya que utiliza un generador para producir las tuplas (clave, valor) en lugar de tener que mantener la lista completa 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')]
>>>
[(k,v) for (k,v) in d.iteritems()]
y
[(v,k) for (k,v) in d.iteritems()]
>>> a={ 'a': 1, 'b': 2, 'c': 3 } >>> [(x,a[x]) for x in a.keys() ] [('a', 1), ('c', 3), ('b', 2)] >>> [(a[x],x) for x in a.keys() ] [(1, 'a'), (3, 'c'), (2, 'b')]
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')]
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
k = (i,d[i])
list.append(k)
print list
Para uso Python3.x
for key, value in dict.items():
temp = [key,value]
dictlist.append(temp)
En Python 2.7 uso
for key, value in dict.iteritems():
temp = [key,value]
dictlist.append(temp)
Gracias