Уведомления

Группа в Telegram: @pythonsu

#1 Июль 17, 2016 20:14:58

Voilin
Зарегистрирован: 2016-07-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Недопонимание в работе словаря

Здравствуйте, недавно заметил довольно неприятную (для меня) особенность. Если вводить в словарь данные, а потом выводить, то порядок изменяется.
Как пример:

 obj = {}
for i in range(10):
	a,b = input().split()
	obj[a] = b
for word in obj:
	print(obj[word])

Ввожу в obj

a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9
j 10

А выходит

2
8
10
4
5
1
3
7
9
6

Я понимаю, что это может быть абсолютно нормально для python, но почему так происходит и можно ли сделать выход данных в таком же порядке, каком они стояли на входе? Искал в нете, но, возможно, плохо искал и ничего не нашёл.

Офлайн

#2 Июль 17, 2016 20:49:13

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Недопонимание в работе словаря

Voilin
но почему так происходит
Потому что словарь так устроен что не гарантирует никакого порядка ключей при итерировании.
Voilin
и можно ли сделать выход данных в таком же порядке
используйте list а не словарь, он гарантирует порядок.



Офлайн

#3 Июль 18, 2016 02:37:54

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Недопонимание в работе словаря

Voilin
и можно ли сделать выход данных в таком же порядке, каком они стояли на входе?
 >>> import collections
>>> 
>>> d = collections.OrderedDict(zip('abcdefg', 'hijklmn'))
>>> d
OrderedDict([('a', 'h'), ('b', 'i'), ('c', 'j'), ('d', 'k'), ('e', 'l'), ('f', 'm'), ('g', 'n')])
>>> 

Voilin
но почему так происходит
Потому что словарь в питоне - это нагруженное множество (динамическая структура). А множество - неупорядоченная структура. Операция поиска во множестве приблизительно равна O(1). Поэтому, хоть оно и не упорядочено, но при миллиарде элементов взятие любого элемента будет одинаково быстрым.

(Ещё есть динамические структуры: стек, очередь, дек, множество, последовательность, Л1-список, Л2-список, динамический вектор.)



Отредактировано py.user.next (Июль 18, 2016 03:00:26)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version