Питовый цикл dict в установленном порядке

У меня возникла проблема с циклизацией через словарь. Следующий код:

d = {}
d['a'] = 1
d['b'] = 2
d['c'] = 3
for k,v in d.iteritems():
 print k,v

Результаты в:

a 1
c 3
b 2

Но желаемый результат:

a 1
b 2
c 3

Кто-нибудь знает, как исправить цикл каким-то образом, чтобы сохранить порядок, которому были присвоены элементы? Спасибо!

2 ответа

В Python нормальные словари были предназначены для неупорядочения. Значит, их здесь нельзя использовать.

Вместо этого вы должны использовать collections.OrderedDict:

>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d['a'] = 1
>>> d['b'] = 2
>>> d['c'] = 3
>>> for k,v in d.iteritems():
... print k,v
...
a 1
b 2
c 3
>>>

В отличие от обычного словаря, OrderedDict гарантированно сохраняет порядок, в котором эти элементы были назначены.


Словарь не сохраняет порядок, поэтому вам нужно отсортировать ключи:

for k,v in sorted(d.iteritems,key=lambda x: x[0]):
 print k,v

Кроме того, используйте объект collections.OrderedDict который внутренне поддерживает список ключей в порядке ввода:

import collections
d = collections.OrderedDict()
...
for k,v in d.iteritems():
 print k,v

licensed under cc by-sa 3.0 with attribution.