Ако искате да разбъркате (сортирате на случаен принцип) елементите на списък (масив) в Python, използвайте модула random на стандартната библиотека.
Има две функции: shuffle(), която подрежда на случаен принцип оригиналния списък, и sample(), която връща нов случайно подреден списък. sample() може да се използва за низове и кортежи.
- Разбъркване на оригиналния списък:
random.shuffle()
- Генериране на нов разбъркан списък.:
random.sample()
- Разбъркване на низове и кортежи
- Определяне на семената на случайните числа
Ако искате да сортирате във възходящ или низходящ ред вместо в произволен, или в обратен ред, вижте следната статия.
- Свързани статии:Сортиране на списък в Python: разлика между сортиран и подреден
Разбъркване на оригиналния списък: 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]