Я просто пытаюсь изучить набор контейнеров в python. Итак, я создал обычный набор, используя:
dset = set(['a','c','z','d'])
но когда я печатаю его, это приводит к:
{'c', 'a', 'z', 'd'}
не должно быть:
{'a', 'c', 'z', 'd'}
Может ли кто-нибудь объяснить, почему результат такой? Есть ли механизм сортировки по умолчанию для заданного типа данных? или моя математика слаба?
Наборы не заказываются, они не являются заказанными контейнерами, поэтому вы ничего не можете сделать,
Если у вас есть список, и вы хотите использовать set, тогда конвертируйте обратно в список упорядоченным способом:
print(sorted(set(l),key=l.index))
Таким образом, нет возможности сделать заказный набор
Btw, есть упорядоченный набор...
Или pip install boltons
, затем:
from boltons.setutils import IndexedSet
Тогда пример:
>>> from boltons.setutils import IndexedSet
>>> x = IndexedSet(list(range(4)) + list(range(8)))
>>> x
IndexedSet([0, 1, 2, 3, 4, 5, 6, 7])
>>> x - set(range(2))
IndexedSet([2, 3, 4, 5, 6, 7])
>>> x[-1]
7
>>> fcr = IndexedSet('freecreditreport.com')
>>> ''.join(fcr[:fcr.index('.')])
'frecditpo'
См. Ссылку
Или pip install sortedcontainers
:
После установки вы можете просто:
from sortedcontainers import SortedSet
help(SortedSet)
Или установите collections_extended
Тогда пример:
>>> from collections_extended import setlist
>>> sl = setlist('abracadabra')
>>> sl
setlist(('a', 'b', 'r', 'c', 'd'))
>>> sl[3]
'c'
>>> sl[-1]
'd'
>>> 'r' in sl # testing for inclusion is fast
True
>>> sl.index('d') # so is finding the index of an element
4
>>> sl.insert(1, 'd') # inserting an element already in raises a ValueError
ValueError
>>> sl.index('d')
4
См. Ссылку
Из документа doc (https://docs.python.org/3.7/library/stdtypes.html#set-types-set-frozenset):
Заданный объект представляет собой неупорядоченный набор различных хешируемых объектов.