Чи існує рішення дизайну Python (PEP), яке виключає додавання відсортованого контейнера до Python?
( OrderedDict
не є відсортованим контейнером, оскільки він упорядкований за порядком вставки.)
Чи існує рішення дизайну Python (PEP), яке виключає додавання відсортованого контейнера до Python?
( OrderedDict
не є відсортованим контейнером, оскільки він упорядкований за порядком вставки.)
Відповіді:
Це свідоме дизайнерське рішення з боку Гвідо (він навіть дещо неохоче ставився до додавання collections
модуля). Його мета - зберегти "один очевидний спосіб зробити це", коли справа стосується вибору типів даних для додатків.
Основна концепція полягає в тому, що якщо користувач досить витончений, щоб усвідомити, що вбудовані типи не є правильним рішенням для їх проблеми, то вони також вирішують завдання пошуку відповідної сторонньої бібліотеки.
З огляду на те, що list + сортування, list + heapq і list + bisect охоплюють багато випадків використання, які в іншому випадку покладалися б на відсортовані за своєю суттю структури даних, і такі пакети, як blist, існують, немає величезного бажання додати більше складності в цей простір стандартна бібліотека.
Певним чином це схоже на той факт, що у стандартній бібліотеці немає багатовимірного масиву, а замість цього передається це завдання людям NumPy.
collections.Counter
може використовуватися як відсортований набір. Хоча це може бути неефективним.
collections.Counter
несортований і не підходить для представлення відсортованого набору.
dict
- це хеш-таблиця.
Існує також модуль сортованих контейнерів python, який реалізує типи сортування списку, dict та набору. Це дуже схоже на blist, але реалізовано в pure-Python і в більшості випадків швидше .
>>> from sortedcontainers import SortedSet
>>> ss = SortedSet([3, 7, 2, 2])
>>> ss
SortedSet([2, 3, 7])
Він також має функціональність, незвичну для інших пакетів:
>>> from sortedcontainers import SortedDict
>>> sd = SortedDict((num, num) for num in range(100000))
>>> sd.iloc[-5] # Lookup the fifth-to-last key.
99995
Застереження: Я є автором модуля відсортованих контейнерів.
Існує також модуль розмивання, який містить тип даних сортування :
sortedset(iterable=(), key=None)
>>> from blist import sortedset
>>> my_set = sortedset([3,7,2,2])
sortedset([2, 3, 7]
У heapq
стандартній бібліотеці є a , він не точно відсортований, а такий. Також є пакет blist , але його немає у стандартній бібліотеці.
Списки Python упорядковані. Якщо їх відсортувати, вони залишаться такими. У Python 2.7 OrderedDict
був доданий тип для ведення явно упорядкованого словника.
Python також має набори (колекція, в якій члени повинні бути унікальними), але за визначенням вони не впорядковані. Сортування набору просто повертає a list
.