Разбъркване на елементи в списък в 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