Ответ 1
Словари в Python по определению не упорядочены. Используйте OrderedDict
, если вам нужен порядок, в который были вставлены значения (доступно в Python 2.7 и 3.x).
Когда я объявляю список 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 @! $! @$# @!
Итак, как мне печатать, получать значения из словаря без изменения позиций элементов.?
Словари в Python по определению не упорядочены. Используйте OrderedDict
, если вам нужен порядок, в который были вставлены значения (доступно в Python 2.7 и 3.x).
порядок сортировки словарей undefined! Не полагайтесь на это ни на что. Ищите сортированный словарь, если вы действительно хотите отсортированный словарь, но обычно вам он не нужен.
Примеры:
Прежде чем вы разозлитесь и расстроены, возможно, вам стоит прочитать о том, что такое словарь на самом деле и как он работает:
http://docs.python.org/library/stdtypes.html#mapping-types-dict
Python dicts использует хеш-таблицу в качестве основного механизма хранения. Это означает, что из ключа, который вы предоставляете, генерируется хэш-ключ. Нет никаких гарантий относительно порядка с этими хэш-ключами. Записи в словаре выбираются в последовательном порядке их местоположения в основной хеш-таблице при запросе значений(), keys() или items().
Преимущество использования хеш-таблицы в том, что она очень быстрая. В отличие от класса map из С++, который использует механизм хранения красно-черного дерева (который сортируется по необработанным ключам), хеш-таблицу не нужно постоянно реструктурировать, чтобы она была эффективной. Подробнее о хэш-таблицах см. Ниже:
http://en.wikipedia.org/wiki/Hash_table
Как и другие плакаты, посмотрите OrderedDict, если вам нужен словарь, отсортированный по ключам.
Удачи!
Ясно, что вы знаете о списках. Вы можете запросить элемент в i-м индексе списка. Это происходит потому, что списки упорядочены.
>>> [1,2,3,4] == [1,4,3,2]
False
В этом контексте вы можете думать о словарях, но где индекс - это ключ. Поэтому два словаря равны, если соответствующие значения всех ключей в обоих словарях одинаковы (если в одном словаре есть ключи, а другой нет, то два не равны). Таким образом:
>>> {1:'a', 2:'b'} == {2:'b', 1:'a'}
True
Дальнейшие мелочи
Словарь делает что-то, называемое хэширование на клавишах словаря, так что когда вы запрашиваете значение по определенному ключу (индексу) он может быстрее получить это значение.
Надеюсь, что это поможет
Словари не сортируются. Это хорошо документировано. Не полагайтесь на упорядочение словарей.
Если вы хотите видеть записи в порядке. что-то вроде:
test2 = {"c":3,"a":1,"b":2,"d":4}
ks = test2.keys()
ks.sort()
for key in ks:
print key + ':' + str(test2[key])
(вырезать, вставить, по вкусу)