Как реализовать ассоциативный массив (не словарь) в Python? - PullRequest
8 голосов
/ 29 февраля 2012

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

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

Хотя пункт «Имя» указан первым, но словари в Python кажутся отсортированными по значениям, поэтомурезультат выглядит следующим образом:

Surname = Dinh
Forename = Paul

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

Ответы [ 6 ]

16 голосов
/ 29 февраля 2012

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

И исходя из вашего описания. Вам действительно нужно collection.OrderedDict module

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.

16 голосов
/ 29 февраля 2012

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

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]

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

РЕДАКТИРОВАТЬ: (спасибо Рик Поджи), OrderedDict делает это для вас:

od=collections.OrderedDict(Arr)
for k in od: print k,od[k]
6 голосов
/ 29 февраля 2012

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

4 голосов
/ 29 февраля 2012

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

Dictionary = {"Forename":"Paul","Surname":"Dinh"}
KeyList = ["Forename", "Surname"]
for Key in KeyList:
    print Key,"=",Dictionary[Key]
3 голосов
/ 29 февраля 2012

Интересно, если это упорядоченный dict , который вы хотите:

>>> 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
3 голосов
/ 29 февраля 2012

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

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

...