Перемешивание элементов в списке в Python

Бизнес

Если вы хотите перетасовать (случайным образом отсортировать) элементы списка (массива) в Python, используйте модуль random стандартной библиотеки.

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

  • Перемешать исходный список:random.shuffle()
  • Создайте новый, перемешанный список.:random.sample()
  • Перемешивание строк и кортежей
  • Зафиксируйте затравку случайного числа

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

Перемешать исходный список: 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]
Copied title and URL