Функция shuffle() модуля random в Python, перемешивает список
Перемешивает изменяемую последовательность случайным образом
Синтаксис:
import random random.shuffle(x[, random])
Параметры:
- x — изменяемая последовательность (список),
- random — функция, которая выдает случайные числа float (устарел с версии Python 3.9 и будет удален в версии 3.11).
Возвращаемое значение:
- изменяет непосредственно сам объект последовательности.
Описание:
Функция shuffle() модуля random перемешивает изменяемую последовательность x на месте. Функция ничего не возвращает, а изменяет непосредственно сам объект последовательности x .
>>> import random >>> lst = list(range(1, 50, 6)) >>> random.shuffle(lst) >>> lst # [31, 1, 49, 19, 7, 37, 25, 13, 43]
Функция random.shuffle() способна работать только с изменяемыми последовательностями, такими как списки, т.е. получить перестановку из строки или кортежа не получится. Для перемешивания неизменяемых последовательностей можно использовать функцию random.sample(x, k=len(x)) как показано ниже в примере.
Необязательный параметр random принимает имя функции которая выдает случайные числа с плавающей точкой в диапазоне [0.0, 1.0] , с единственным условием — данная функция не должна принимать параметры. По умолчанию это функция random.random() :
>>> import random >>> lst = [1, 2, 3, 4] >>> random.shuffle(lst, random.random) >>> lst # [2, 3, 4, 1]
Внимание! Необязательный аргумент random устарел с версии Python 3.9 и будет удален в версии 3.11.
Пример перемешивания последовательности.
Например, получить перестановку элементов списка, другими словами перемешать, можно как-то так:
>>> import random # получаем список цифр от 0 до 8 >>> x = list(range(0,9)) # список `x` перемешивается "на месте" # т.е. новый список не возвращается >>> random.shuffle(x) # [4, 6, 0, 7, 2, 3, 1, 8, 5]
Что бы перемешать неизменяемую последовательность (строку, кортеж), ее необходимо преобразовать в список:
# преобразуем строку в список букв >>> x = list('абракадабра') >>> random.shuffle(x) # ['а', 'а', 'к', 'б', 'р', 'а', 'р', 'а', 'б', 'а', 'д'] # преобразуем полученный список обратно в строку >>> ''.join(x) # 'аакбрарабад'
или воспользоваться функцией random.sample() .
>>> import random >>> x = 'абракадабра' >>> random.sample(x, len(x)) # ['р', 'к', 'а', 'д', 'а', 'б', 'а', 'р', 'а', 'б', 'а']
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Генерация случайного целого числа или байтов
- Генерация случайных вещественных чисел
- Функция choice() модуля , выбирает случайный элемент
- Функция random.choices(), выбирает несколько случайных элементов
- Функция shuffle() модуля random, перемешивает список
- Функция random.sample() модуля random
- Инициализация и состояние генератора
- Классы Random() и SystemRandom() модуля random
- Вероятностные распределения в модуле random Python
- Рецепты использования модуля random
- Функция binomialvariate() модуля random
Как перемешать двумерный список?
Обычно преобразуют в одномерный список (честно или при помощи абстракции), перемешивают, и восстанавливают размеры.
Набросал такой перемешиватель:
import random class Shuffler: def __init__(self, lst, depth=2): self.lst = lst self.depth = depth random.shuffle(self) def __getlevel(self, index, depth): curr = self.lst curr_depth = depth while curr_depth > 0: curr_depth -= 1 curr_size = len(curr) curr = curr[index % curr_size] index //= curr_size return curr, index def __getitem__(self, index): value, index = self.__getlevel(index, self.depth) if index > 0: raise IndexError('list index out of range') return value def __setitem__(self, index, value): last_line, line_index = self.__getlevel(index, self.depth - 1) last_line[line_index] = value return value def __len__(self): acc = 1 curr = self.lst curr_depth = self.depth while curr_depth > 0: curr_depth -= 1 acc *= len(curr) if acc: curr = curr[0] return acc lst = [[i * 10 + j for j in range(10)] for i in range(10)] Shuffler(lst, 2) print(*lst, sep='\n')
[45, 50, 74, 1, 3, 29, 43, 2, 93, 68]
[41, 10, 51, 99, 85, 20, 95, 54, 59, 8]
[46, 64, 24, 12, 26, 15, 6, 76, 39, 5]
[58, 13, 44, 60, 36, 70, 63, 79, 42, 18]
[9, 69, 25, 66, 67, 65, 35, 47, 23, 87]
[78, 80, 22, 73, 97, 31, 91, 75, 82, 90]
[57, 38, 49, 11, 84, 17, 62, 7, 89, 71]
[40, 30, 86, 94, 21, 53, 14, 19, 0, 32]
[33, 37, 61, 92, 81, 88, 56, 83, 98, 34]
[96, 16, 52, 4, 27, 55, 48, 72, 77, 28]
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
random.shuffle() — перемешивает одномерный массив.
Можно просто пройтись по строкам массива (двумерного списка) и применить к каждой shuffle. Затем применить shuffle к самому массиву.
Это если в изначальном запросе подразумевается равномерное перемешивание элементов по всему массиву.
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Python
- +2 ещё
TypeError: event_list() missing 1 required positional argument: ‘call_data» aiogram при использовании CallbackFactory?
- 1 подписчик
- 3 часа назад
- 4 просмотра
Как перемешать два списка?
Если ключевым является «перемешать», воспользуйтесь random.shuffle():
import random l1=[1, 2, 3] l2=['test1', 'test2', 'test3'] l3 = l1 + l2 print(f'before: ') random.shuffle(l3) print(f'after: ')
before: [1, 2, 3, 'test1', 'test2', 'test3'] after: ['test3', 2, 3, 'test2', 'test1', 1]
Отслеживать
ответ дан 20 мая 2021 в 10:17
12.5k 7 7 золотых знаков 18 18 серебряных знаков 48 48 бронзовых знаков
l1=[1,2,3] l2=['test1','test2','test3'] res = [x for y in zip(l2, l1) for x in y]
['test1', 1, 'test2', 2, 'test3', 3]
Отслеживать
ответ дан 20 мая 2021 в 9:44
25k 4 4 золотых знака 20 20 серебряных знаков 36 36 бронзовых знаков
Еще вариант c chain :
from itertools import chain l1=[1,2,3] l2=['test1','test2','test3'] *res, = chain.from_iterable(zip(l2,l1)) print(res) # ['test1', 1, 'test2', 2, 'test3', 3]
from functools import reduce import operator l1=[1,2,3] l2=['test1','test2','test3'] res = reduce(operator.add, zip(l2,l1)) print(res) # ('test1', 1, 'test2', 2, 'test3', 3)
Отслеживать
ответ дан 20 мая 2021 в 10:16
3,225 1 1 золотой знак 10 10 серебряных знаков 21 21 бронзовый знак
С chain отличный вариант. А с reduce работает за квадрат. И reduce(operator.add, . ) равносилен sum(. ()) .
20 мая 2021 в 13:04
l1=[1,2,3] l2=['test1','test2','test3'] res = list(sum(zip(l2,l1),())) print(res) # ['test1', 1, 'test2', 2, 'test3', 3]
sum умеет «выпрямлять» коллекции, только нужно начальное значение подходящее указать, () — это пустой кортеж и zip тоже выдаёт кортежи.
Если порядок элементов в объединении списков не важен, то можно списки просто сложить:
print(l1 + l2) # [1, 2, 3, 'test1', 'test2', 'test3']
Перемешать список Python
В этом посте мы обсудим, как перетасовать список в Python. Решение должно на месте перетасовать содержимое списка.
1. Использование random.shuffle
Стандартным решением для перетасовки списка в Python является использование shuffle() функцию от random модуль. Это показано ниже:
from random import shuffle
if __name__ == ‘__main__’ :
nums = list ( range ( 10 ) )
shuffle ( nums )
print ( nums )
2. Использование random.sample
The shuffle() Функция перемешивает список на месте, т. е. элементы переставляются внутри списка. Чтобы перетасовать неизменяемый список, используйте sample() вместо этого, который вернет новый рандомизированный список. Это показано ниже:
from random import sample
if __name__ == ‘__main__’ :
nums = range ( 10 )
l = sample ( nums , len ( nums ) )
3. Использование numpy.random.shuffle
Если вы используете библиотеку NumPy, рассмотрите возможность использования numpy.random.shuffle . Он изменяет список на месте, перемешивая его содержимое.
import numpy as np
if __name__ == ‘__main__’ :
nums = list ( range ( 10 ) )
np . random . shuffle ( nums )
print ( nums )
Это все о перетасовке списка в Python.
Оценить этот пост
Средний рейтинг 4.5 /5. Подсчет голосов: 24
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Подписывайся
0 Комментарии
Встроенные отзывы
Просмотреть все комментарии
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации
- Все проблемы
- Практика DSA
- 100 самых популярных задач
- 50 лучших классических задач
- Лучшие алгоритмы
- Компилятор С/С++
- Компилятор Java
- Компилятор Python
- Компилятор JavaScript
- компилятор PHP
- Компилятор C#
- Свяжитесь с нами
- Политика конфиденциальности
- условия обслуживания
- Подпишитесь на новые публикации
Techie Delight © 2023 Все права защищены.
Этот веб-сайт использует файлы cookie. Используя этот сайт, вы соглашаетесь с использованием файлов cookie, нашей политикой, условиями авторского права и другими условиями. Читайте наши Политика конфиденциальности. Понятно
