2012-02-29 15 views
7

Yo tratando de imprimir un diccionario en Python:¿Cómo implementar una matriz asociativa (no un diccionario) en Python?

Dictionary = {"Forename":"Paul","Surname":"Dinh"} 
for Key,Value in Dictionary.iteritems(): 
    print Key,"=",Value 

Aunque el elemento "Nombre de pila" aparece en primer lugar, pero los diccionarios de Python parecen ser ordenados por valores, por lo que el resultado es la siguiente:

Surname = Dinh 
Forename = Paul 

Cómo imprimir estas con el mismo orden en el código o el orden cuando los artículos se incluirán en (no ordenados por valores ni por teclas)?

+3

usted podría utilizar una lista adicional de llaves para determinar el orden – Nobody

+0

estoy pensando de utilizar 2 listas (matrices de python), luego use "enumerar", pero esto es complejo – jondinham

+3

¿También necesita la capacidad de acceder rápidamente por clave? –

Respuesta

15

Puede usar una lista de tuplas (o una lista de listas). De esta manera:

Arr= [("Forename","Paul"),("Surname","Dinh")] 
for Key,Value in Arr: 
    print Key,"=",Value 

Forename = Paul 
Surname = Dinh 

puede hacer un diccionario de esto con:

Dictionary=dict(Arr) 

Y las teclas correctamente ordenados así:

keys = [k for k,v in Arr] 

Luego de hacer esto:

for k in keys: print k,Dictionary[k] 

pero estoy de acuerdo con los comentarios en su pregunta: ¿No sería fácil ordenar las claves en el orden requerido cuando se realiza un bucle en su lugar?

EDIT: (gracias Rik Poggi), OrderedDict lo hace por usted:

od=collections.OrderedDict(Arr) 
for k in od: print k,od[k] 
+0

¿está bien usar: Arr = [["Forename", "Paul"], ["Surname", "Dinh"]]? – jondinham

+3

lista de tuplas es cómo se implementan los 'OrderedDict's, si el diccionario es la estructura que el OP está buscando, el debería simplemente usarlos y guardar el dolor de conversión todo el tiempo. –

+1

@RikPoggi. Ah, agregué eso. –

3

'pero los diccionarios de Python están ordenadas según los valores' tal vez me equivoque aquí, pero lo que juego esa ideea? Los diccionarios no están ordenados por nada.

Tendría dos soluciones, ya sea mantener una lista de teclas adicionales al diccionario o utilizar una estructura de datos diferente, como una matriz o matrices.

4

Esto puede satisfacer mejor sus necesidades:

Dictionary = {"Forename":"Paul","Surname":"Dinh"} 
KeyList = ["Forename", "Surname"] 
for Key in KeyList: 
    print Key,"=",Dictionary[Key] 
+0

pero la mayoría de las veces parece que no conozco la lista de claves – jondinham

+1

Entonces, ¿cómo sabes el género :) –

+0

hay un caso: digamos que el 'Diccionario' me lo devuelve una función. y quiero mantener el orden de los valores creados por esa función (a través de 'append', por ejemplo) – jondinham

16

En primer lugar, los diccionarios no están ordenados ni por clave ni por valor.

Y en base a su descripción. Usted necesita actualy collections.OrderedDict módulo

from collections import OrderedDict 

my_dict = OrderedDict([("Forename", "Paul"), ("Surname", "Dinh")]) 

for key, value in my_dict.iteritems(): 
    print '%s = %s' % (key, value) 

en cuenta que necesita para crear una instancia OrderedDict de la lista de tuplas no de otro dict dict como instancia se baraja el orden de los elementos antes se creará una instancia OrderedDict.

+0

Entonces, comenzando desde Python 3.6 dicts, mantenga las claves en orden. – lig

3

Me pregunto si es una dict ordenada que desea:

>>> k = "one two three four five".strip().split() 
>>> v = "a b c d e".strip().split() 
>>> k 
    ['one', 'two', 'three', 'four', 'five'] 
>>> v 
    ['a', 'b', 'c', 'd', 'e'] 
>>> dx = dict(zip(k, v)) 
>>> dx 
    {'four': 'd', 'three': 'c', 'five': 'e', 'two': 'b', 'one': 'a'} 
>>> for itm in dx: 
     print(itm) 

    four 
    three 
    five 
    two 
    one 

>>> # instantiate this data structure from OrderedDict class in the Collections module 
>>> from Collections import OrderedDict 
>>> dx = OrderedDict(zip(k, v)) 
>>> for itm in dx: 
     print(itm) 

    one 
    two 
    three 
    four 
    five 

Un diccionario creado usando el OrderdDict conserva el orden original de inserción.

Dicho de otra manera, dicho diccionario repite los pares clave/valor de acuerdo con el orden en que se insertaron.

Así, por ejemplo, cuando se elimina una clave y luego se agrega la misma tecla, el orden de iteración es: cambios

>>> del dx['two'] 
>>> for itm in dx: 
     print(itm) 

     one 
     three 
     four 
     five 

>>> dx['two'] = 'b' 
>>> for itm in dx: 
     print(itm) 

     one 
     three 
     four 
     five 
     two 
+0

¿Por qué no utilizar el código de la pregunta? – lig

+0

¿es necesario para poder entender mi respuesta? De hecho, no usé los datos de muestra de OP por dos razones: (i) estamos hablando de secuencias ordenadas aquí y los datos de OP solo tienen * dos * pares de valores-clave; y (ii) elegí claves y valores para mis datos de muestra que permiten que un lector vea fácilmente el punto de mi código, es decir, la preservación de la orden. – doug

Cuestiones relacionadas