funciones - ¿Cómo puedo convertir un diccionario de Python a una lista de tuplas?
ejercicio diccionario python (9)
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'') ]
Lo que quiere son los métodos de dict
items()
y iteritems()
. 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 la iteración, iteritems
es preferible ya que usa 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'')]
>>>
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'')]
Puedes usar listas de comprensión.
[(k,v) for k,v in a.iteritems()]
obtendrá [ (''a'', 1), (''b'', 2), (''c'', 3) ]
y
[(v,k) for k,v in a.iteritems()]
el otro ejemplo.
Lea más sobre la lista de comprensiones si lo desea, es muy interesante lo que puede hacer con ellos.
ya que nadie más lo hizo, agregaré las 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'')]
Crea una lista de namedtuples
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 puntaje de, digamos, el jugador con el puntaje más alto (índice = 0) muy similar a Python:
>>> player = best[0]
>>> player.name
''Alex''
>>> player.score
10
Como hacer esto:
liste en orden aleatorio o mantenga el orden de las collections.OrderedDict . collections.OrderedDict :
import collections
Player = collections.namedtuple(''Player'', ''name score'')
players = list(Player(*item) for item in d.items())
en orden, ordenados por valor (''puntaje''):
import collections
Player = collections.namedtuple(''Player'', ''score name'')
ordenado con el puntaje más bajo primero:
worst = sorted(Player(v,k) for (k,v) in d.items())
ordenado con el puntaje más alto primero:
best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
>>> 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'')]
>>> 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 dicts no tienen ningún orden específico de todos modos. Ordénelo u organícelo según sea necesario.
Ver: items() , 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 ítems del diccionario. Consulte el documento Novedades para Python 3.0 y la nueva documentación sobre vistas .
[(k,v) for (k,v) in d.iteritems()]
y
[(v,k) for (k,v) in d.iteritems()]
d = {''John'':5, ''Alex'':10, ''Richard'': 7}
list = []
for i in d:
k = (i,d[i])
list.append(k)
print list