Будет ли диктовать Python с целыми числами в качестве ключей, естественно отсортированных?

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

то есть. будет

my_dict = {}
for x in range(0,100):
  my_dict[x] = str(x)

for item in my_dict.items():
  print item

всегда приводит к печати списка в порядке значения ключа?

Ответы

Ответ 1

Короче говоря, нет. Я уверен, что вы заметили, что словари используют хэши ключей как индексы в массиве, а так как хэш-хеш от их собственных значений, вы вывели, что вставленные значения закончились в порядке по ключу, если их ключи целые. Хотя первые 2 части этого утверждения верны, вывод не является, даже как недокументированный побочный эффект. Диск-ключи производятся из хэшей ключей, но не являются полными хэшами. Это означает, что даже с целыми ключами вы все равно можете выйти из порядка вставки, так как 2 значения могут столкнуться в одном и том же месте (или даже иметь "выведенные из строя" значения хэша), и, таким образом, в результате вставлять ключи не в порядок в ДИКТ.

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

Ответ 2

Нет, словари Python не имеют встроенного порядка, независимо от значений ключа. Если вам нужно заказать, придерживайтесь массивов или списков или еще лучше - проверьте pandas, что позволит аналогичной способности к словарям вызывать по ключевому значению, а также многим другим мощным функциям (http://pandas.pydata.org/pandas-docs/stable/10min.html).

Ответ 3

Нет, вы не можете. Всегда сортируйте, если вы хотите итерации упорядоченным образом.

Ответ 4

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

Ответ 5

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

Python поставляется с коллекциями .OrderedDict, но это сортируется по порядку вставки, а не по порядку ключа.

Вот два словарноподобных модуля, которые сортируют по ключам:

https://pypi.python.org/pypi/treap/

https://pypi.python.org/pypi/red-black-tree-mod/

Некоторые говорят, что treaps быстрее в среднем, чем красно-черные деревья, но красно-черные деревья имеют более низкое стандартное отклонение во время работы. Другие спрашивают об этом, хотя в моих тестах первое доказано.

Оба treaps и красно-черные деревья делают почти все в O (logn) времени, но постоянно сохраняют свои ключи. Словари Python для большинства операций - O (1). Однако получение всех ключей в порядке O (n) для treaps и красно-черных деревьев, тогда как O (nlogn) для словарей.

Когда вы должны использовать какой?

  • Если вы занимаетесь сортировкой в ​​цикле, вам, вероятно, лучше с помощью или красно-черное дерево.
  • Если вы сортируете один раз в конце своей программы или что-то еще, вам, вероятно, будет лучше с list_ = list (dict_); list_.sort()
  • Если вы сохраняете порядок своих входов, например, из конфигурационного файла или что-то, вы, вероятно, лучше всего с OrderedDict.

НТН