Используйте метод pop на множестве, чтобы отбрасывать предметы, всегда отбрасывать одни и те же предметы - PullRequest
0 голосов
/ 03 мая 2020
x = [1, 2, 3, 3, 4, 4]
y = set(x)

print(y)

y.pop()
y.pop()

print(y)

Это мой мой пример кода. В документации, которую я прочитал, наборы всегда сбрасывают случайные элементы, но мой код всегда возвращает это:

{1, 2, 3, 4}
{3, 4}

Я что-то здесь не так делаю или почему всегда пропускаются первые два элемента? Если я хочу отбросить последний элемент, нужно ли преобразовывать набор в список, а затем обратно в набор?

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Это происходит потому, что вы pop всегда из одного и того же set. Наборы не имеют порядка, это детали реализации, как именно их элементы размещены в памяти. Обычно для каждого элемента вычисляется функция ha sh, и эта функция сообщает, какой элемент стоит первым. Так что это не «случайный» в том смысле, что вы будете получать разные элементы при каждом запуске, это «случайный», как в «произвольном» смысле, вы не можете полагаться на очевидный порядок.

И, кстати. в CPython 3,7 dict теперь заказано (но не set).

0 голосов
/ 03 мая 2020

Когда в документации написано, что это "случайно", это означает, что вы не должны ожидать от него ничего за исключением того, что он уронит элемент. Это не обязательно означает, что это равномерно случайно. (Технически это случайный, просто не равномерно случайный случай, о котором люди думают, когда думают о случайности)

Если вы хотите отбрасывать элементы равномерно случайным образом, тогда, возможно, вам следует рассмотреть возможность использования списка и вызова shuffle для него, а затем поппинг элементы.

random.shuffle(lst)
while lst:
  print(lst.pop())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...