Перамешваць элементы ў спісе ў Python

Бізнэс

Калі вы хочаце перамяшаць (выпадкова сартаваць) элементы спісу (масіў) у Python, выкарыстоўвайце выпадковы модуль стандартнай бібліятэкі.

Ёсць дзве функцыі: 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]