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

Я пытаюсь распечатать словарь на Python:

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

хотя элемент "Forename" указан первым, но словари в Python кажется сортируется по значениям, поэтому результат выглядит так:

Surname = Dinh
Forename = Paul

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

6 ответов


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

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: (спасибо Рик Поджи), OrderedDict делает это для вас:

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

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

и основываясь на вашем описании. Вам действительно нужно сборники.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 из списка кортежей не из другого dict, так как экземпляр dict перетасует порядок элементов до создания экземпляра OrderedDict.


можно использовать collections.OrderedDict. Он доступен в python2.7 и python3.2+.


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

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

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

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


интересно, если это заказал дикт что требуется:

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