У меня есть список объектов, и я хочу перетасовать их. Я думал, что мог бы использовать random.shuffle
метод, но это, кажется, не удается, когда список объектов. Есть ли способ перетасовки объектов или другой способ обойти это?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
Это не удастся.
Ответы:
random.shuffle
должно сработать. Вот пример, где объекты являются списками:Обратите внимание, что shuffle работает на месте и возвращает None.
источник
random
модуля .random.sample(x, len(x))
или просто сделать копию иshuffle
тому подобное . Дляlist.sort
которого есть аналогичная проблема, есть сейчасlist.sorted
, но нет аналогичного варианта дляshuffle
.from random import SystemRandom
вместо этого; добавьтеcryptorand = SystemRandom()
и измените строку 3 наcryptorand.shuffle(x)
Как вы узнали, проблема была в перестановке на месте. У меня также часто бывают проблемы, и я часто забываю, как копировать список. Использование
sample(a, len(a))
является решением, используяlen(a)
в качестве размера выборки. См. Https://docs.python.org/3.6/library/random.html#random.sample для документации по Python.Вот простая версия, использующая
random.sample()
возвращенный случайный результат в виде нового списка.источник
old = [1,2,3,4,5]; new = list(old); random.shuffle(new); print(old); print(new)
(замените; наold[:]
также может сделать мелкую копию для спискаold
.sample()
особенно полезно для прототипирования анализа данных.sample(data, 2)
для настройки кода клея конвейера, а затем пошагово «расширяя» его доlen(data)
.Мне потребовалось некоторое время, чтобы получить это тоже. Но документация по shuffle очень понятна:
Так что не стоит
print(random.shuffle(b))
. Вместо этого делайrandom.shuffle(b)
и потомprint(b)
.источник
источник
Если вы уже используете numpy (очень популярный для научных и финансовых приложений), вы можете сэкономить импорт.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
источник
Он отлично работает для меня. Обязательно установите случайный метод.
источник
Если у вас есть несколько списков, вы можете сначала определить перестановку (способ перестановки списка / перестановки элементов в списке), а затем применить его ко всем спискам:
Numpy / Scipy
Если ваши списки являются массивами, это проще:
MPU
Я создал небольшой пакет утилит,
mpu
который имеетconsistent_shuffle
функцию:Обратите внимание, что
mpu.consistent_shuffle
принимает произвольное количество аргументов. Таким образом, вы также можете перемешать три или более списков с ним.источник
Эта альтернатива может быть полезна для некоторых приложений, где вы хотите поменять местами функцию упорядочения.
источник
sorted
этому, это функциональная случайность (если вам это нравится).В некоторых случаях при использовании массивов NumPy, используя
random.shuffle
дублированные данные в массиве.Альтернативой является использование
numpy.random.shuffle
. Если вы уже работаете с numpy, это предпочтительный метод по сравнению с универсальнымrandom.shuffle
.numpy.random.shuffle
пример
Использование
random.shuffle
:Использование
numpy.random.shuffle
:источник
numpy.random.permutation
могут представлять интерес: stackoverflow.com/questions/15474159/shuffle-vs-permute-numpyrandom.shuffle
документация должна кричать Не используйте Numpy массивыДля однострочников используйте
random.sample(list_to_be_shuffled, length_of_the_list)
пример:выходы: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]
источник
«print func (foo)» напечатает возвращаемое значение «func» при вызове с «foo». 'shuffle', однако, имеет None в качестве возвращаемого типа, поскольку список будет изменен на месте, следовательно, он ничего не печатает. Временное решение:
Если вы больше знакомы с функциональным стилем программирования, вы можете сделать следующую функцию-обертку:
источник
random.sample(ls, len(ls))
если вы действительно хотите пойти по этому пути.Можно определить функцию под названием
shuffled
(в том же смыслеsort
противsorted
)источник
shuffle
на месте, так что не печатать результатNone
, а список.источник
Вы можете пойти на это:
Если вы хотите вернуться к двум спискам, вы можете разделить этот длинный список на два.
источник
Вы могли бы построить функцию, которая принимает список в качестве параметра и возвращает перемешанную версию списка:
источник
источник
Вы можете использовать случайный порядок или образец. оба из которых приходят из случайного модуля.
ИЛИ
источник
Убедитесь, что вы не называете свой исходный файл random.py, и что в вашем рабочем каталоге нет файла с именем random.pyc .. либо это может привести к тому, что ваша программа попытается импортировать ваш локальный файл random.py вместо случайного модуля pythons ,
источник
источник
_list.extend(list2)
, который является более кратким и более эффективным.источник
Процесс перетасовки "с заменой" , поэтому появление каждого элемента может измениться! По крайней мере, когда, когда элементы в вашем списке также список.
Например,
После,
Число [0] может быть 9 или 8, но не точно 10.
источник
План: Запишите случайное перемешивание, не полагаясь на библиотеку для выполнения тяжелой работы. Пример: просмотреть список с начала, начиная с элемента 0; найдите для него новую случайную позицию, скажем 6, поместите значение 0 в 6 и значение 6 в 0. Перейдите к элементу 1 и повторите этот процесс, и так далее до конца списка.
источник
my_list[i], my_list[j] = my_list[j], my_list[i]
Работает нормально. Я пытаюсь это здесь с функциями в качестве объектов списка:
Распечатывается: foo1 foo2 foo3 foo2 foo3 foo1 (foos в последнем ряду имеют случайный порядок)
источник