Перемішувати елементи в списку в 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() випадкового модуля, початкове число випадкових чисел можна зафіксувати, а генератор випадкових чисел можна ініціалізувати.

Після ініціалізації з тим самим початковим елементом він завжди переупорядковується таким же чином.

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]