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