Вопрос-Ответ

Shuffling a list of objects [duplicate]

Перетасовка списка объектов

Как мне перетасовать список объектов? Я пробовалrandom.shuffle:

import random

b = [object(), object()]

print(random.shuffle(b))

Но это выводит:

None
Переведено автоматически
Ответ 1

random.shuffle должно сработать. Вот пример, где объектами являются списки:

from random import shuffle

x = [[i] for i in range(10)]
shuffle(x)
print(x)

# print(x) gives [[9], [2], [7], [0], [4], [5], [3], [1], [8], [6]]

Обратите внимание, что shuffle работает на месте и возвращает None.

В более общем плане в Python изменяемые объекты могут передаваться в функции, и когда функция изменяет эти объекты, стандартом является возврат None (а не, скажем, измененного объекта).

Ответ 2

Как вы узнали, проблема заключалась в перетасовке на месте. У меня тоже часто возникают проблемы, и, похоже, я часто забываю, как скопировать список. Решение заключается в использовании sample(a, len(a)), используя len(a) в качестве размера выборки. Документацию по Python смотрите https://docs.python.org/3.6/library/random.html#random.sample.

Вот простая версия, использующая random.sample(), которая возвращает перетасованный результат в виде нового списка.

import random

a = range(5)
b = random.sample(a, len(a))
print a, b, "two list same:", a == b
# print: [0, 1, 2, 3, 4] [2, 1, 3, 4, 0] two list same: False

# The function sample allows no duplicates.
# Result can be smaller but not larger than the input.
a = range(555)
b = random.sample(a, len(a))
print "no duplicates:", a == list(set(b))

try:
random.sample(a, len(a) + 1)
except ValueError as e:
print "Nope!", e

# print: no duplicates: True
# print: Nope! sample larger than population
Ответ 3

В документации для random.shuffle указано, что это будет


Перетасуйте последовательность x на месте.


Не делайте:

print(random.shuffle(xs))  # WRONG!

Вместо этого выполните:

random.shuffle(xs)
print(xs)
Ответ 4
#!/usr/bin/python3

import random

s=list(range(5))
random.shuffle(s) # << shuffle before print or assignment
print(s)

# print: [2, 4, 1, 3, 0]
2023-04-26 01:11 python list