Сохраняют ли диктанты порядок итераций, если они не изменены? - PullRequest
19 голосов
/ 04 декабря 2009

Если у меня есть словарь в Python, и я перебираю его один раз, а потом снова позже, гарантированно ли будет сохранен порядок итераций, учитывая, что я не вставлял, не удалял и не обновлял какие-либо элементы в словаре? (Но я мог бы сделать поиск).

Ответы [ 7 ]

31 голосов
/ 04 декабря 2009

Вот что dict.items() документация говорит:

dict.items () возвращает копию списка словаря пар (ключ, значение).

Если items (), keys (), values ​​(), iteritems (), iterkeys () и itervalues ​​() вызываются без промежуточных модификаций словаря, списки будут напрямую соответствовать.

Я думаю, что разумно предположить, что порядок элементов не изменится, если все, что вы делаете, это итерация.

12 голосов
/ 04 декабря 2009

Стандартный Python dict, как и большинство реализаций, не сохраняет порядок, поскольку элементы обычно доступны с помощью ключа.

Однако предсказуемая итерация иногда полезна, и в Python 3.1 модуль collections содержит OrderedDict , который сохраняет порядок с минимальными потерями производительности.

5 голосов
/ 04 декабря 2009

Да. Там нет никакой рандомизации. Есть еще более сильная гарантия - см. здесь .

4 голосов
/ 05 декабря 2009

collections.OrderedDict будет доступен в Python 2.7 в дополнение к Python 3.1.

Для версий Python более ранних, чем 2.7, в PyPI есть colle.ordereddict , а у Django есть собственная реализация SortedDict .

2 голосов
/ 04 декабря 2009

Может быть сохранено в некоторых реализациях, но не рассчитывайте на это, поскольку оно не является частью спецификации Dict.

2 голосов
/ 04 декабря 2009

Словарь Python не имеет понятия порядка. Таким образом, вы не можете зависеть от конкретного заказа во время итерации.

Это преднамеренно: поскольку это хэш-карта, это неизбежно, если вам нужны «быстрые поиски»!

1 голос
/ 04 декабря 2009

Как сказал Кристоф, словарь используется для организации пар ключ / значение из-за быстрого времени доступа, которое он обеспечивает. Если вашему приложению требуется фиксированный индекс, вам следует обратить внимание на другие структуры данных, которые обеспечивают определенный / известный порядок.

Сказав это, следует с уверенностью предположить, что порядок не изменится, пока не будут добавлены элементы (не было бы смысла делать эту дорогостоящую операцию перестановки вещей) и т. Д., Но, опять же, не полагайтесь на нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...