2009-11-05 19 views
111

Duplicar posible:
How can I convert a Python dictionary to a list of tuples?conversión de diccionario de Python a la lista

Estoy tratando de convertir un diccionario de Python en una lista de Python, con el fin de realizar algunos cálculos.

#My dictionary 
dict = {} 
dict['Capital']="London" 
dict['Food']="Fish&Chips" 
dict['2012']="Olympics" 

#lists 
temp = [] 
dictList = [] 

#My attempt: 
for key, value in dict.iteritems(): 
    aKey = key 
    aValue = value 
    temp.append(aKey) 
    temp.append(aValue) 
    dictList.append(temp) 
    aKey = "" 
    aValue = "" 

Ese es mi intento ... pero no sé qué ocurre?

+0

'suma (dict.items(),())' – Natim

Respuesta

92

Su problema es que usted tiene key y value entre comillas haciéndolos cuerdas, es decir, se está configurando aKey a contener la cadena "key" y no el valor de la variable key. Además, no está borrando la lista temp, por lo que la está agregando cada vez, en lugar de solo tener dos elementos.

para fijar su código, intente algo como:

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

No es necesario copiar las variables de bucle key y value en otra variable antes de usarlos, así que les dejé. Del mismo modo, no es necesario usar append para compilar una lista, solo puede especificarla entre corchetes como se muestra arriba. Y podríamos haber hecho dictlist.append([key,value]) si quisiéramos ser lo más breves posible.

O simplemente use dict.items() como se ha sugerido.

+1

Respuesta correcta debido a que se explica lo que estaba haciendo mal . Como puede ver, soy bastante conocedor de Python y cualquier explicación es muy apreciada. ¡Aclamaciones! – Federer

+1

Si usa listas de anexar como esta, está produciendo una lista de listas. Lo que él quería era una lista plana, para la cual utilizaría extender() como en la respuesta de Shay. –

+1

Él nunca dijo eso, Ajith. Una lista de listas es una lista python válida, y una interpretación mucho mejor de un "diccionario" que una lista plana que contiene solo valores que no son de lista. Una lista de listas es al menos capaz de mostrar claves y valores aún agrupados. – codetaku

305
dict.items() 

Tiene el truco.

+7

sabía que habría alguna manera ridícula Pythonic de hacer esto, muchas gracias de verdad. ¡La documentación de Python me resulta bastante difícil de leer! – Federer

+12

@shylent creo que lo dijo como ridículamente obvio/fácil/pythonic – ofko

+1

Siempre puede usar * help (dict) * en la línea de comandos de Python y reemplazar * dict * con el objeto problemático para ver una lista de sus métodos de ayuda, etc. ., p.ej * items (...) D.items() -> lista de pares D (clave, valor), como 2-tuplas * –

19
>>> a = {'foo': 'bar', 'baz': 'quux', 'hello': 'world'} 
>>> list(reduce(lambda x, y: x + y, a.items())) 
['foo', 'bar', 'baz', 'quux', 'hello', 'world'] 

Explicar: a.items() devuelve una lista de tuplas. Agregar dos tuplas juntas hace que una tupla contenga todos los elementos. Por lo tanto, la reducción crea una tupla que contiene todas las claves y valores y luego la lista (...) hace una lista a partir de eso.

+0

Interesante ... Podría ser útil para este tipo de fusión en alguna parte. –

+1

Para Python 3.^en lugar de usar reducir, use functools.reduce –

10

Probablemente lo que desea es la siguiente:

dictList = dict.items() 

Su enfoque tiene dos problemas. Para uno, usa key y value entre comillas, que son cadenas con las letras "clave" y "valor", no relacionadas con las variables de esos nombres. También sigues agregando elementos a la lista "temporal" y nunca te deshaces de los elementos antiguos que ya existen en iteraciones anteriores. Asegúrate de que tienes una nueva y vacía la lista temp en cada iteración y utilizar los key y value variables:

for key, value in dict.iteritems(): 
    temp = [] 
    aKey = key 
    aValue = value 
    temp.append(aKey) 
    temp.append(aValue) 
    dictList.append(temp) 

También tenga en cuenta que esto se podría escribir más corto sin las variables temporales:

for key, value in dict.iteritems(): 
    dictList.append([key, value]) 
36

Usted debe use dict.items().

Aquí es una solución de un trazador de líneas para su problema:

[(k,v) for k,v in dict.items()] 

y resultado:

[('Food', 'Fish&Chips'), ('2012', 'Olympics'), ('Capital', 'London')] 

o puede hacerlo

l=[] 
[l.extend([k,v]) for k,v in dict.items()] 

para:

['Food', 'Fish&Chips', '2012', 'Olympics', 'Capital', 'London'] 
+2

En Python 2.6, al menos, no necesita dict.items(): '[(k, v) para k, v en dict]'. – hughdbrown

+1

Python3.6 - '[x para x en dict.items()]' hace lo mismo. – Blacksilver

2

Si está haciendo un diccionario solo para hacer una lista de tuplas, como crear dicts como usted puede ser una molestia, podría considerar usar zip()

Es especialmente útil si tiene uno encabezado y múltiples filas. Por ejemplo si asumo que desea estadísticas Juegos Olímpicos por países:

headers = ['Capital', 'Food', 'Year'] 
countries = [ 
    ['London', 'Fish & Chips', '2012'], 
    ['Beijing', 'Noodles', '2008'], 
] 

for olympics in countries: 
    print zip(headers, olympics) 

da

[('Capital', 'London'), ('Food', 'Fish & Chips'), ('Year', '2012')] 
[('Capital', 'Beijing'), ('Food', 'Noodles'), ('Year', '2008')] 

No sabe si esa es la meta final, y mi ser fuera de tema, pero podría ser algo tenga en cuenta.

127

Conversión de dict a la lista es fácil en Python. Tres ejemplos:

>> d = {'a': 'Arthur', 'b': 'Belling'} 

>> d.items() 
[('a', 'Arthur'), ('b', 'Belling')] 

>> d.keys() 
['a', 'b'] 

>> d.values() 
['Arthur', 'Belling'] 
+0

¿Es posible especificar el orden de 'values ​​()'?¿El orden de los valores de un dict estándar está definido? –

+2

@MichaelScheper [El orden del dict estándar no se especifica] (http://stackoverflow.com/a/9001529/638546) y el orden de los valores puede ser diferente del orden de inserción. Sin embargo, uno podría [ordenar las listas de arriba] (https://wiki.python.org/moin/HowTo/Sorting) o usar ** OrderedDict ** (ver el primer enlace). –

Cuestiones relacionadas