Почему словарные значения не находятся в вставленном порядке?

Когда я объявляю список 1,2,3,4, и я что-то делаю с ним, даже просто печатаю, я возвращаю одну и ту же последовательность 1,2,3,4.

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

test1 = [4,1,2,3,6,5]
print test1
test2 = {"c":3,"a":1,"b":2,"d":4}
print test2 

[4, 1, 2, 3, 6, 5]
{'a': 1, 'c': 3, 'b': 2, 'd': 4}

Как в мире "a" стал первым элементом и "c", даже если он в алфавитном порядке сортировал словарь, он должен был быть 1,2,3,4 или a, b, c, d не 1,3, 2,4. wT? F @! $! @$# @!

Итак, как мне печатать, получать значения из словаря без изменения позиций элементов.?

Ответ 1

Словари в Python по определению не упорядочены. Используйте OrderedDict, если вам нужен порядок, в который были вставлены значения (доступно в Python 2.7 и 3.x).

Ответ 2

порядок сортировки словарей undefined! Не полагайтесь на это ни на что. Ищите сортированный словарь, если вы действительно хотите отсортированный словарь, но обычно вам он не нужен.

Примеры:

  • python 2.7, он встроен в модуль коллекций
  • Django имеет SortedDict, поставляемый с ним
  • 2.4-2.7 вы можете использовать модуль orderdict, вы можете установить его или просто установить его

Ответ 3

Прежде чем вы разозлитесь и расстроены, возможно, вам стоит прочитать о том, что такое словарь на самом деле и как он работает:

http://docs.python.org/library/stdtypes.html#mapping-types-dict

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

Преимущество использования хеш-таблицы в том, что она очень быстрая. В отличие от класса map из С++, который использует механизм хранения красно-черного дерева (который сортируется по необработанным ключам), хеш-таблицу не нужно постоянно реструктурировать, чтобы она была эффективной. Подробнее о хэш-таблицах см. Ниже:

http://en.wikipedia.org/wiki/Hash_table

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

Удачи!

Ответ 4

Ясно, что вы знаете о списках. Вы можете запросить элемент в i-м индексе списка. Это происходит потому, что списки упорядочены.

>>> [1,2,3,4] == [1,4,3,2]
False

В этом контексте вы можете думать о словарях, но где индекс - это ключ. Поэтому два словаря равны, если соответствующие значения всех ключей в обоих словарях одинаковы (если в одном словаре есть ключи, а другой нет, то два не равны). Таким образом:

>>> {1:'a', 2:'b'} == {2:'b', 1:'a'}
True

Дальнейшие мелочи

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

Надеюсь, что это поможет

Ответ 5

Словари не сортируются. Это хорошо документировано. Не полагайтесь на упорядочение словарей.

Ответ 6

Если вы хотите видеть записи в порядке. что-то вроде:

test2 = {"c":3,"a":1,"b":2,"d":4}
ks = test2.keys()
ks.sort()
for key in ks:
   print key + ':' + str(test2[key])

(вырезать, вставить, по вкусу)