Почему random.shuffle возвращает None?
random.shuffle() изменяет список x на месте.
Методы API Python, которые изменяют структуру на месте, обычно возвращают None , а не модифицированную структуру данных.
Если вы хотите создать новый случайный перетасованный список на основе существующего, где существующий список поддерживается в порядке, вы можете использовать random.sample() с полной длиной ввода:
x = ['foo', 'bar', 'black', 'sheep'] random.sample(x, len(x))
Вы также можете использовать sorted() с random.random() для сортировочного ключа:
shuffled = sorted(x, key=lambda k: random.random())
но это вызывает сортировку (операция O (NlogN)), тогда как выборка на входную длину принимает только операции 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
Перемешайте последовательность x на место. Необязательный аргумент random — это 0-аргумент, возвращающий случайное значение float в [0.0, 1.0]; от default, это функция random().
>>> x = ['foo','bar','black','sheep'] >>> from random import shuffle >>> shuffle(x) >>> x ['bar', 'black', 'sheep', 'foo']
Ответ 4
shuffle изменяет список на месте. Это хорошо, потому что копирование большого списка было бы чисто накладными расходами, если вам больше не нужен оригинальный список.
Согласно принципу «явно лучше, чем неявно» питонского стиля, возвращение списка было бы плохой идеей, потому что тогда можно подумать, что это новый, хотя на самом деле это не так.
Если вам нужен свежий список, вам придется написать что-то вроде
new_x = list(x) # make a copy random.shuffle(new_x)
что приятно явно. Если вам часто нужна эта идиома, оберните ее в shuffled функцию (см. sorted ), которая возвращает new_x .
Ответ 5
У меня был мой аха-момент с этой концепцией:
from random import shuffle x = ['foo','black','sheep'] #original list y = list(x) # an independent copy of the original for i in range(5): print shuffle(y) # shuffles the original "in place" prints "None" return print x,y #prints original, and shuffled independent copy >>> None ['foo', 'black', 'sheep'] ['foo', 'black', 'sheep'] None ['foo', 'black', 'sheep'] ['black', 'foo', 'sheep'] None ['foo', 'black', 'sheep'] ['sheep', 'black', 'foo'] None ['foo', 'black', 'sheep'] ['black', 'foo', 'sheep'] None ['foo', 'black', 'sheep'] ['sheep', 'black', 'foo']
Ответ 6
не возвращает никаких значений. Вместо этого эта функция перемешивает саму переменную.
вместо этого просто напечатайте переменную, как это.
>>> x = ['foo','bar','black','sheep'] >>> from random import shuffle >>> x ['bar', 'black', 'foo', 'sheep']
Ответ 7
Python API, которые изменяют структуру на месте, возвращают None в качестве вывода.
from random import shuffle print(shuffle(list))
from random import sample print(sample(list, len(list)))
Ответ 8
>> x = ['foo','bar','black','sheep'] >> random.shuffle(x) >> print(x) >> ['sheep', 'bar', 'foo', 'black']
Как уже указывалось, random.shuffle заменяется на месте, поэтому вам не понадобится новая переменная списка.
Ответ 9
Вы можете вернуть перемешанный список с помощью random.sample() как объяснено другими. Он работает путем выборки k элементов из списка без замены. Поэтому, если в вашем списке есть дубликаты, они будут обрабатываться уникально.
>>> l = [1,4,5,3,5] >>> random.sample(l,len(l)) [4, 5, 5, 3, 1] >>> random.sample(l,len(l)-1) [4, 1, 5, 3] >>> random.sample(l,len(l)-1) [3, 5, 5, 1]
Почему random.shuffle возвращает None?
random.shuffle() изменяет список x на месте.
Методы API Python, которые изменяют структуру на месте, обычно возвращают None , а не модифицированную структуру данных.
Если вы хотите создать новый случайный перетасованный список на основе существующего, где существующий список поддерживается в порядке, вы можете использовать random.sample() с полной длиной ввода:
x = ['foo', 'bar', 'black', 'sheep'] random.sample(x, len(x))
Вы также можете использовать sorted() с random.random() для сортировочного ключа:
shuffled = sorted(x, key=lambda k: random.random())
но это вызывает сортировку (операция O (NlogN)), тогда как выборка на входную длину принимает только операции 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']
Как насчет .pop() ? Это удаляет указанный индекс из списка и возвращает элемент, или я что-то упустил
@Haidro: конечно, .pop() явно задокументирован как возвращающий удаленный элемент. Скорректирована формулировка.
Гарантировано ли использование key функции со случайным значением? Некоторые алгоритмы быстрой сортировки перестают работать, если сравнения не являются самосогласованными. Я могу видеть, что это работает в любом случае, в зависимости от реализации (decorate-sort-undecorate нужно будет только один раз применить key к каждому элементу, поэтому он будет четко определен).
Вы также можете скопировать x в y, импортировав copy и выполнив y = copy.copy(x) а затем выполните перемешивание для y
@SteveWilhelm: не нужно импортировать copy , просто используйте y = list(x) , см . Ответ Лутца ниже . Это немного медленнее, хотя.
@MartijnPieters спасибо за указание на это. Вот хороший пост, объясняющий различные методы. stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list
Почему random.shuffle возвращает None?
random.shuffle() изменяет список x на месте .
Методы Python API, которые изменяют структуру на месте, обычно возвращают None , а не измененную структуру данных.
Если вы хотите создать новый случайный случайный список на основе существующего списка, где существующий список хранится в порядке, вы можете использовать random.sample() с полной длиной ввода:
x = ['foo', 'bar', 'black', 'sheep'] random.sample(x, len(x))
Вы также можете использовать sorted() с random.random() для ключа сортировки:
shuffled = sorted(x, key=lambda k: random.random())
Но это вызывает сортировку (операция O (NlogN)), в то время как выборка по входной длине требует только 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']
Вы можете вернуть перетасованный список, используя random.sample() , как объяснено другими. Он работает путем выборки k элементов из списка без замены . Поэтому, если в вашем списке есть дубликаты элементов, они будут обрабатываться уникально.
>>> l = [1,4,5,3,5] >>> random.sample(l,len(l)) [4, 5, 5, 3, 1] >>> random.sample(l,len(l)-1) [4, 1, 5, 3] >>> random.sample(l,len(l)-1) [3, 5, 5, 1]
У меня был момент ага с этой концепцией, как это:
from random import shuffle x = ['foo','black','sheep'] #original list y = list(x) # an independent copy of the original for i in range(5): print shuffle(y) # shuffles the original "in place" prints "None" return print x,y #prints original, and shuffled independent copy >>> None ['foo', 'black', 'sheep'] ['foo', 'black', 'sheep'] None ['foo', 'black', 'sheep'] ['black', 'foo', 'sheep'] None ['foo', 'black', 'sheep'] ['sheep', 'black', 'foo'] None ['foo', 'black', 'sheep'] ['black', 'foo', 'sheep'] None ['foo', 'black', 'sheep'] ['sheep', 'black', 'foo']
API-интерфейсы Python, которые изменяют структуру на месте, возвращают Нет в качестве вывода.
from random import shuffle print(shuffle(list))
from random import sample print(sample(list, len(list)))
Why does random.shuffle return None?
shuffle modifies the list in place. This is nice, because copying a large list would be pure overhead if you do not need the original list anymore.
2. Pythonic style
According to the «explicit is better than implicit» principle of pythonic style, returning the list would be a bad idea, because then one might think it is a new one although in fact it is not.
But I don’t like it like this!
If you do need a fresh list, you will have to write something like
new_x = list(x) # make a copy random.shuffle(new_x)
which is nicely explicit. If you need this idiom frequently, wrap it in a function shuffled (see sorted ) that returns new_x .
Shuffle the sequence x in place. The optional argument random is a 0-argument function returning a random float in [0.0, 1.0); by default, this is the function random().
>>> x = ['foo','bar','black','sheep'] >>> from random import shuffle >>> shuffle(x) >>> x ['bar', 'black', 'sheep', 'foo']
random.shuffle() changes the x list in place.
Python API methods that alter a structure in-place generally return None , not the modified data structure.
>>> x = ['foo', 'bar', 'black', 'sheep'] >>> random.shuffle(x) >>> x ['black', 'bar', 'sheep', 'foo']
If you wanted to create a new randomly-shuffled list based on an existing one, where the existing list is kept in order, you could use random.sample() with the full length of the input:
You could also use sorted() with random.random() for a sorting key:
shuffled = sorted(x, key=lambda k: random.random())
but this invokes sorting (an O(N log N) operation), while sampling to the input length only takes O(N) operations (the same process as random.shuffle() is used, swapping out random values from a shrinking pool).
>>> 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']