/
Вопросы и ответы
/
Python
/

Что такое функция shuffle в Python?

Что такое функция shuffle в Python?

4 года назад

Andrey Moshkov

Ответы

1

Функция shuffle() модуля random перемешивает элементы изменяемой последовательности (список) на месте в случайном порядке.

1
2
3
import random

random.shuffle(x) # где x - изменяемая последовательность (список)

Функция ничего не возвращает, а изменяет непосредственно сам объект последовательности.

1
2
3
4
5
6
7
8
import random

a = [1, 2, 3, 4, 5, 6]
b = random.shuffle(a)
print(a)
# => [5, 3, 2, 1, 6, 4]
print(b)
# => None

Функция shuffle() способна работать только с изменяемыми последовательностями, такими как списки, поэтому применить ее к неизменяемым последовательностям, таким как строка или кортеж не получится. Для перемешивания неизменяемых последовательностей можно преобразовать неизменяемую последовательность к изменяемой:

1
2
3
4
5
6
7
8
9
10
import random

a = (1, 2, 3, 4, 5, 6)
random.shuffle(a) # Так как кортеж неизменяемый объект, то вернется ошибка
TypeError: 'tuple' object does not support item assignment
# Преобразуем кортеж в список
b = list(a)
random.shuffle(b)
print(b)
# => [1, 5, 3, 4, 2, 6]

Так же можно использовать функцию random.sample().

1
2
3
4
5
6
import random

random.sample(x, k, *, counts=None)
# x - последовательность или множество
# k - количество выбираемых элементов
# counts - список элементов для повтора (для Python версии 3.9 и выше)

Количество возвращаемых элементов в выборке не должно превышать размер самой выборки, т.е. k <= len(x), в противном случае будет ошибка ValueError.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import random

a = 'QWERTYUIOP'
b = random.sample(a, 10) # В отличие от shuffle - метод возвращает новую последовательность.
print(b)
# => ['U', 'P', 'Q', 'E', 'T', 'R', 'Y', 'W', 'O', 'I']

b = random.sample(a, 11)
ValueError: Sample larger than population or is negative


a = random.sample(['A', 'B', 'C'], counts=[1, 2, 3], k=6)
print(a)
# 'A', 'B', 'C' повторяется в соответствии со значениями в counts
# => ['A', 'C', 'C', 'B', 'C', 'B']

4 года назад

Дмитрий Ибрагимов

0

random.shuffle() перемешивает элементы списка в случайном порядке:

1
2
3
4
5
import random

cards = [1, 2, 3, 4, 5]
random.shuffle(cards)
print(cards)  # например, [3, 5, 1, 4, 2]

Функция меняет сам список и возвращает None. Частая ошибка:

1
2
cards = random.shuffle(cards)
print(cards)  # None

Перемешать и сохранить исходный список

random.sample() возвращает новый перемешанный список:

1
2
3
cards = [1, 2, 3, 4, 5]
shuffled = random.sample(cards, k=len(cards))
print(cards)  # [1, 2, 3, 4, 5]

Строки и кортежи

Строки и кортежи неизменяемые, shuffle для них выдаст TypeError. Перемешайте символы и соберите строку заново:

1
2
3
word = 'python'
mixed = ''.join(random.sample(word, k=len(word)))
print(mixed)  # например, 'htnyop'

Одинаковый порядок при каждом запуске

Для тестов и воспроизводимых экспериментов задайте зерно генератора:

1
2
3
4
random.seed(42)
data = [1, 2, 3, 4, 5]
random.shuffle(data)
print(data)  # при seed(42) порядок каждый раз один и тот же

NumPy и pandas

1
2
3
4
5
6
7
8
import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
arr = rng.permutation(10)  # перемешанный массив от 0 до 9

df = pd.DataFrame({'x': range(5)})
df = df.sample(frac=1).reset_index(drop=True)  # перемешать строки таблицы

Для паролей и токенов модуль random не подходит. Используйте secrets: secrets.SystemRandom().shuffle(items).

Модули стандартной библиотеки разбирают в бесплатном курсе «Основы Python».

10 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845