Если вы хотите перетасовать (случайным образом отсортировать) элементы списка (массива) в Python, используйте модуль random стандартной библиотеки.
Есть две функции: shuffle(), которая случайным образом сортирует исходный список, и sample(), которая возвращает новый случайно отсортированный список. sample() можно использовать для строк и кортежей.
- Перемешать исходный список:
random.shuffle()
- Создайте новый, перемешанный список.:
random.sample()
- Перемешивание строк и кортежей
- Зафиксируйте затравку случайного числа
Если вы хотите сортировать в порядке возрастания или убывания вместо случайного, или в обратном порядке, см. следующую статью.
- Похожие статьи:Сортировка списка в Python: разница между sorted и sorted
Перемешать исходный список: random.shuffle()
Функция shuffle() в модуле random может случайным образом отсортировать исходный список.
import random
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
random.shuffle(l)
print(l)
# [1, 0, 4, 3, 2]
Создайте новый, перемешанный список.: random.sample()
Функция sample() в модуле random может быть использована для создания нового списка, отсортированного случайным образом, без изменения исходного списка.
sample() — это функция, которая случайным образом выбирает и извлекает элемент из списка. Первым аргументом является список, а вторым — количество элементов, которые необходимо извлечь. Подробнее см. в следующей статье.
Если количество элементов, которые будут выбраны с помощью sample(), равно общему количеству элементов в списке, мы получим новый список со всеми элементами, отсортированными случайным образом. Общее количество элементов в списке можно получить с помощью функции len().
Исходный объект не будет изменен.
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
lr = random.sample(l, len(l))
print(lr)
# [0, 3, 1, 4, 2]
print(l)
# [0, 1, 2, 3, 4]
Перемешивание строк и кортежей
Строки и кортежи неизменяемы, поэтому если вы используете random.shuffle() для изменения исходного объекта, вы получите следующую ошибку.TypeError
s = 'abcde'
# random.shuffle(s)
# TypeError: 'str' object does not support item assignment
t = tuple(range(5))
print(t)
# (0, 1, 2, 3, 4)
# random.shuffle(t)
# TypeError: 'tuple' object does not support item assignment
Если вы хотите перетасовать строку или кортеж, используйте random.sample(), который создает новый объект.
Даже если в качестве аргумента указана строка или кортеж, random.sample() возвращает список, поэтому необходимо обработать его обратно в строку или кортеж.
В случае со строкой это будет список символов один за другим. Чтобы снова объединить их в одну строку, используйте метод join().
sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca
Для кортежей используйте функцию tuple(), которая создает кортеж из списка.
tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)
Зафиксируйте затравку случайного числа
Задав произвольное целое число функции seed() модуля random, можно зафиксировать семя случайного числа и инициализировать генератор случайных чисел.
После инициализации одним и тем же семенем они всегда переупорядочиваются одним и тем же способом.
l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]
l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]