Как реализовать ассоциативный массив (не словарь) в 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