2009-03-23 14 views

Respuesta

278
>>> 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. Ordénelo u organícelo según sea necesario.

Ver: items(), 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 . Consulte el documento What's New para Python 3.0 y el nuevo documentation on views.

+0

artículos() devuelve un dict_keys ver en python3. Envuelva esta llamada con un molde a una lista "list()". Ver la respuesta de @ SilentGhost – Erich

2
[(k,v) for (k,v) in d.iteritems()] 

y

[(v,k) for (k,v) in d.iteritems()] 
+6

"[(k, v) para (k, v) en d.iteritems()]" es un terrible equivalente a d.items() –

5

Lo que queremos es items() y iteritems() métodos dict 's. 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, es preferible iteritems 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')] 
>>> 
14

Puede usar la lista de comprensiones.

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

le conseguirá [ ('a', 1), ('b', 2), ('c', 3) ] y

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

otro ejemplo.

Read more about list comprehensions si quieres, es muy interesante lo que puedes hacer con ellas.

2
 
>>> 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')] 
30

ya que nadie más lo hizo, 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')] 
7

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, ordenados si se quiere, y obtener el nombre y la puntuación de, vamos a decir que el jugador con la puntuación más alta (índice = 0) muy Pythonically así:

>>> player = best[0] 

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

Cómo hacer esto:

lista en orden aleatorio o mantener el orden de collections.OrderedDict:

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 baja puntuación primera:

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) 
3

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

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

Demostració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')] 
+0

Esto funcionó para mí como alternativa a 'collections.OrderedDict () 'que funciona mejor con múltiples versiones de Python HTTP Requests lib. Aunque no me gusta el nombre de la función 'zip' como algo vago/sobrecargado. – MarkHu

+0

Tenga en cuenta que el 'zip'-ification no es un casting" profundo ", es decir, si hay hijos anidados, no se verán afectados. Es posible que deba desplegar su propia recursión. – MarkHu

2
d = {'John':5, 'Alex':10, 'Richard': 7} 
list = [] 
for i in d: 
    k = (i,d[i]) 
    list.append(k) 

print list 
+2

Aunque este código puede ayudar a resolver el problema, no explica _why_ y/o _how_ responde la pregunta. Proporcionar este contexto adicional mejoraría significativamente su valor educativo a largo plazo. Por favor [edite] su respuesta para agregar una explicación, incluyendo qué limitaciones y suposiciones se aplican. –

Cuestiones relacionadas