Понимание функции set ()

python set

142216 просмотра

5 ответа

В 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.

Автор: Prakhar Mehrotra Источник Размещён: 12.11.2019 09:40

Ответы (5)


68 плюса

Решение

Наборы неупорядочены, как вы говорите. Несмотря на то, что одним из способов реализации наборов является использование дерева, они также могут быть реализованы с использованием хеш-таблицы (то есть получение ключей в отсортированном порядке может быть не таким простым).

Если вы хотите отсортировать их, вы можете просто выполнить:

sorted(set(y))

который создаст отсортированный список, содержащий элементы набора. (Не набор. Опять же, наборы неупорядочены.)

В противном случае гарантируется только то, setчто он делает элементы уникальными (ничего не будет там более одного раза).

Надеюсь это поможет!

Автор: user Размещён: 03.03.2013 02:45

14 плюса

Как неупорядоченный тип коллекции, set([8, 1, 6])эквивалентен set([1, 6, 8]).

Хотя было бы лучше отображать установленное содержимое в отсортированном порядке, это сделало бы repr()вызов более дорогим.

Внутренне setтип реализован с использованием хеш-таблицы: хеш-функция используется для разделения элементов на несколько сегментов, чтобы уменьшить количество операций равенства, необходимых для проверки, является ли элемент частью набора.

Чтобы произвести repr()вывод, он просто выводит элементы из каждого сегмента по очереди, что вряд ли будет отсортированным порядком.

Автор: James Henstridge Размещён: 03.03.2013 02:46

7 плюса

Как + Волатильность и вы сами указали, множества неупорядочены. Если вам нужно, чтобы элементы были в порядке, просто вызовите sortedнабор:

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> sorted(set(y))
[1, 6, 8]
Автор: I82Much Размещён: 03.03.2013 02:43

5 плюса

Наборы (и словари) 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}

Это зависит от реализации, поэтому вы не должны на это полагаться.

Автор: Blckknght Размещён: 03.03.2013 02:50

2 плюса

Прочитав другие ответы, я все еще не мог понять, почему набор выходит неупорядоченным.

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

Автор: Ania Размещён: 25.08.2017 08:23
Вопросы из категории :
32x32