Понимание функции set()
В python set()
является неупорядоченной коллекцией без дубликатов элементов. Однако я не могу понять, как он генерирует результат.
Например, рассмотрим следующее:
>>> x = [1, 1, 2, 2, 2, 2, 2, 3, 3]
>>> set(x)
set([1, 2, 3])
>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> set(y)
set([8, 1, 6])
>>> z = [1, 1, 6, 6, 6, 6, 6, 7, 7]
>>> set(z)
set([1, 6, 7])
Не следует ли выводить set(y)
: set([1, 6, 8])
? Я пробовал эти два в Python 2.6.
Ответы
Ответ 1
Установки неупорядочены, как вы говорите. Несмотря на то, что одним из способов реализации наборов является использование дерева, они также могут быть реализованы с использованием хеш-таблицы (что означает, что ключи в отсортированном порядке могут быть не такими тривиальными).
Если вы хотите отсортировать их, вы можете просто выполнить:
sorted(set(y))
который будет создавать отсортированный список, содержащий заданные элементы. (Не набор. Опять же, наборы неупорядочены.)
В противном случае единственное, что гарантируется set
, это то, что он делает элементы уникальными (ничего не будет более одного раза).
Надеюсь, это поможет!
Ответ 2
Как тип неупорядоченного сбора, set([8, 1, 6])
эквивалентен set([1, 6, 8])
.
Хотя было бы лучше отображать содержимое набора в отсортированном порядке, это сделало бы вызов repr()
более дорогим.
Внутренне тип set
реализуется с использованием хеш-таблицы: хеш-функция используется для разделения элементов на несколько ковшей для уменьшения количества операций равенства, необходимых для проверки того, является ли элемент частью набора.
Чтобы создать вывод repr()
, он просто выводит элементы из каждого ведра по очереди, что вряд ли будет упорядоченным.
Ответ 3
As + Volatility и вы указали, что наборы неупорядочены. Если вам нужно, чтобы элементы были в порядке, просто позвоните sorted
в набор:
>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> sorted(set(y))
[1, 6, 8]
Ответ 4
Наборы Python (и словари) будут итерации и распечатываться в некотором порядке, но точно, что будет с этим порядком, будет произвольным и не будет гарантировано оставаться неизменным после добавления и удаления.
Здесь пример набора изменения порядка после добавления большого количества значений и последующего удаления:
>>> s = set([1,6,8])
>>> print(s)
{8, 1, 6}
>>> s.update(range(10,100000))
>>> for v in range(10, 100000):
s.remove(v)
>>> print(s)
{1, 6, 8}
Это зависит от реализации, и поэтому вы не должны полагаться на него.
Ответ 5
Я задал один и тот же вопрос сегодня и увязал его с этим ответом. Мне все еще трудно понять , почему набор выходит из строя.
Упоминал это моему партнеру, и он придумал эту метафору: возьмите мрамор. Вы помещаете их в тюбик чуть шире, чем ширина мрамора: у вас есть список. Набор, однако, представляет собой сумку. Даже если вы кормите мрамор один за другим в сумку; когда вы выливаете их из мешка обратно в трубку, они не будут в одном порядке (потому что они все перемешались в сумке).