Якщо ви хочете перемішати (випадково відсортувати) елементи списку (масиву) в 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]