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

Why does random.shuffle return None?

Почему random.shuffle возвращает None?

Почему random.shuffle возвращается None в Python?

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None

Как мне получить значение в случайном порядке вместо None?

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

random.shuffle() изменяет x список на месте.

Методы Python API, которые изменяют структуру на месте, обычно возвращают None, а не измененную структуру данных.

>>> x = ['foo', 'bar', 'black', 'sheep']
>>> random.shuffle(x)
>>> x
['black', 'bar', 'sheep', 'foo']

Если вы хотите создать новый список в случайном порядке на основе существующего, где существующий список поддерживается в порядке, вы могли бы использовать random.sample() с полной длиной входных данных:

random.sample(x, len(x))     

Вы также могли бы использовать sorted() with random.random() для ключа сортировки:

shuffled = sorted(x, key=lambda k: random.random())

но это вызывает сортировку (операция O (N log N)), в то время как выборка до длины ввода требует всего O (N) операций (используется тот же процесс, что и random.shuffle(), заменяющий случайные значения из сокращающегося пула).

ДЕМОНСТРАЦИЯ:

>>> import random
>>> x = ['foo', 'bar', 'black', 'sheep']
>>> random.sample(x, len(x))
['bar', 'sheep', 'black', 'foo']
>>> sorted(x, key=lambda k: random.random())
['sheep', 'foo', 'black', 'bar']
>>> x
['foo', 'bar', 'black', 'sheep']
Ответ 2

Этот метод тоже работает.

import random
shuffled = random.sample(original, len(original))
Ответ 3

Почему, на самом деле?

1. Эффективность

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

2. Pythonic стиль

Согласно принципу pythonic-стиля"явное лучше неявного", возвращать список было бы плохой идеей, потому что тогда можно было бы подумать, что он является новым, хотя на самом деле это не так.

Но мне это так не нравится!

Если вам действительно нужен новый список, вам придется написать что-то вроде

new_x = list(x)  # make a copy
random.shuffle(new_x)

что довольно явно.
Если вам часто нужна эта идиома, оберните ее в функцию shuffled (см. sorted), которая возвращает new_x.

Ответ 4

Согласно документам:


Перетасуйте последовательность x на место. Необязательный аргумент random - это функция с 0 аргументами, возвращающая случайное значение с плавающей точкой в [0.0, 1.0); по умолчанию это функция random().


>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> shuffle(x)
>>> x
['bar', 'black', 'sheep', 'foo']
python list