2016-08-16 4 views
4
exampleDict = {'a':1, 'b':2, 'c':3, 'd':4} 

выше словаря изначально итерация в таком порядке:Можно изменить внутренний словарь?

b=2 
d=4 
a=1 
c=3 

Затем я переехал около тонны файлов в моем коде, и теперь он перебирает в таком порядке:

d=4 
a=1 
c=3 
b=2 

Я знаю, что заказ внутренне хранится как hashmap, но что может вызвать изменение внутреннего заказа?

Редактировать: Мне не нужно сохранять порядок, поэтому я буду придерживаться использования dict. Мне просто интересно, почему это произошло. Я думал, что порядок не гарантирован, но как только он имеет свой произвольный внутренний порядок, он придерживается его для будущих итераций.

+1

это не ответ на ваш вопрос, но если вы заботитесь о заказе, вы не должны использовать 'dict'. –

+0

Порядок вставки может привести к изменению порядка, наблюдаемого во время итерации. Кроме того, направление ветра. Ваш результат находится в том же порядке, что и раньше, при этом только 'b = 2' переместился в конец. –

+0

В зависимости от порядка вставки записи могут меняться (из-за хеш-коллизий). Мне интересно, почему это имеет значение? – AndyG

ответ

5

Dict не имеют фиксированный порядок, от documentation

деталь реализации CPython: Ключи и значения перечислены в произвольный порядок, который является неслучайным, варьируется в зависимости от реализации Python и зависит от истории вставки словаря и удаления.

Если вам действительно нужно держать его заказал, есть объект, называемый OrderedDict:

from collections import OrderedDict 
exampleDict = OrderedDict({'a':1, 'b':2, 'c':3, 'd':4}) 

смотри также OrderedDict документацию here

-1

Да. Если вы измените код между различными вызовами в dict, порядок итераций изменится.

От docs

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

Если порядок введения вещества, проверьте OrderedDict класс

+0

* «Да. Если вы измените код между различными вызовами в dict, порядок итераций изменится.«* Пожалуйста, скажите мне, где это определено, и почему, вызывая, например,' time.time(), приведет к изменению произвольного порядка. –

+0

Спасибо, мое предложение должно быть понятным. Если вы измените словарь, заказ будет изменение. – RahulHP

0

Любопытный о том, почему вы хотите, чтобы они заказали. Есть ли вероятность, что это просто для последовательной регистрации/печати или аналогичного? Если это так, вы можете сортировать клавиши по алфавиту. См. Другую статью: How to sort dictionary by key in numerical order Python

Смежные вопросы