Подтвердить что ты не робот

Понимание функции 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.

4b9b3361

Ответ 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

Я задал один и тот же вопрос сегодня и увязал его с этим ответом. Мне все еще трудно понять , почему набор выходит из строя.

Упоминал это моему партнеру, и он придумал эту метафору: возьмите мрамор. Вы помещаете их в тюбик чуть шире, чем ширина мрамора: у вас есть список. Набор, однако, представляет собой сумку. Даже если вы кормите мрамор один за другим в сумку; когда вы выливаете их из мешка обратно в трубку, они не будут в одном порядке (потому что они все перемешались в сумке).