2012-02-29 2 views
7

Я пытаюсь распечатать словарь в Python:Как реализовать ассоциативный массив (не словарь) в Python?

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

Хотя пункт «Имя, отчество» указан первым, но словари в Python кажутся отсортированных по значениям, так что результат таков:

Surname = Dinh 
Forename = Paul 

Как распечатать их с тем же порядком в коде или порядок, когда элементы добавляются в (не отсортированы по значениям, ни ключей)?

+3

Вы могли бы использовать дополнительный список ключей для определения порядка – Nobody

+0

я имею в виду из использования 2 списков (массивы python), затем используйте «enumerate», но это сложно – jondinham

+3

Вам также нужна возможность быстрого доступа к нему по ключу? –

ответ

15

Вы можете использовать список кортежей (или список списков). Как это:

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

Forename = Paul 
Surname = Dinh 

вы можете сделать словарь из этого с:

Dictionary=dict(Arr) 

И в правильно отсортированные ключи, как это:

keys = [k for k,v in Arr] 

Тогда это сделать:

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

но я согласен с комментариями на ваш вопрос: не будет ли удобнее сортировать ключи в требуемом порядке, если вместо этого зацикливаться?

EDIT: (спасибо Rik Poggi) OrderedDict делает это для вас:

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

это нормально использовать: Arr = [["Forename", "Paul"], ["Surname", "Dinh"]] вместо этого? – jondinham

+3

Список кортежей - это как 'OrderedDict' реализованы, если словарь - это структура, которую ищет OP, он должен просто использовать их и каждый раз сохранять боль в конверсии. –

+1

@RikPoggi. Ах, добавил. –

3

«но словари в Python отсортирован по значениям», может быть, я здесь ошибаюсь, но в какую игру ты что идее? Словари ничем не сортируются.

У вас было бы два решения: сохранить список ключей, дополняющих словарь, или использовать другую структуру данных, такую ​​как массив или массивы.

4

Это может удовлетворить ваши потребности лучше:

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

, но большую часть времени я, похоже, не знаю список ключей. – jondinham

+1

Итак, как вы знаете сортировку :) –

+0

есть случай: скажем, «Словарь» передается мне функцией. и я хочу сохранить порядок значений, созданных этой функцией (например, «добавить») – jondinham

16

Прежде всего словари не сортируются ни по ключе, ни по значению.

И исходя из вашего описания. Вы actualy нужны collections.OrderedDict модуля

from collections import OrderedDict 

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

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

Обратите внимание, что вам нужно создать экземпляр OrderedDict из списка кортежей не из другого Словаре, как ДИКТ экземпляр будет перетасовать порядок пунктов, прежде чем OrderedDict будет экземпляром.

+0

Итак, начиная с Python 3.6 dicts сохраняйте порядок ключей. – lig

3

Интересно, если это приказал ДИКТ, что вы хотите:

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

Словарь создан с использованием OrderdDict сохраняет оригинальный порядок добавления.

Другими словами, такой словарь выполняет итерацию по парам ключ/значение в соответствии с порядком, в котором они были вставлены.

Так, например, при удалении ключа, а затем добавить один и тот же ключ снова, порядок итерации изменение:

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

Почему бы вам не использовать этот код? – lig

+0

это необходимо для того, чтобы вы могли понять мой ответ? Фактически, я не использовал выборочные данные OP по двум причинам: (i) мы говорим о упорядоченных последовательностях здесь, и данные OP имеют только две пары «ключи-значение»; и (ii) я выбрал ключи и значения для своих выборочных данных, которые позволяют читателю легко увидеть точку моего кода - т. е. порядок сохранения. – doug

Смежные вопросы