Tasowanie elementów na liście w Pythonie

Biznes

Jeśli chcesz przetasować (losowo posortować) elementy listy (tablicy) w Pythonie, użyj modułu random biblioteki standardowej.

Istnieją dwie funkcje: shuffle(), która losowo sortuje oryginalną listę, oraz sample(), która zwraca nową losowo posortowaną listę. sample() może być używana dla łańcuchów i tupli.

  • Przetasuj oryginalną listę:random.shuffle()
  • Wygeneruj nową, potasowaną listę.:random.sample()
  • Tasowanie ciągów i krotek
  • Ustalenie nasion liczb losowych

Jeśli chcesz sortować w kolejności rosnącej lub malejącej zamiast losowej, lub w odwrotnej kolejności, zobacz poniższy artykuł.

Przetasuj oryginalną listę: random.shuffle()

Funkcja shuffle() w module random może losowo posortować oryginalną listę.

import random

l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]

random.shuffle(l)
print(l)
# [1, 0, 4, 3, 2]

Wygeneruj nową, potasowaną listę.: random.sample()

Funkcja sample() w module random może być użyta do utworzenia nowej listy, która jest losowo posortowana, bez zmiany oryginalnej listy.

sample() jest funkcją, która losowo wybiera i pobiera element z listy. Pierwszym argumentem jest lista, a drugim liczba elementów, które mają zostać pobrane. Zobacz następujący artykuł dla szczegółów.

Jeśli liczba elementów, które zostaną wybrane przez sample() jest równa całkowitej liczbie elementów na liście, to otrzymamy nową listę z losowo posortowanymi elementami. Całkowita liczba elementów na liście jest uzyskiwana przez len().

Oryginalny obiekt nie zostanie zmieniony.

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]

Tasowanie ciągów i krotek

Ciągi i tuple są niezmienne, więc jeśli użyjesz random.shuffle() do zmiany oryginalnego obiektu, otrzymasz następujący błąd.
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

Jeśli chcesz przetasować ciąg lub tuple, użyj random.sample(), która tworzy nowy obiekt.

Nawet jeśli jako argument podany jest łańcuch lub tuple, random.sample() zwraca listę, więc konieczne jest przetworzenie jej z powrotem na łańcuch lub tuple.

W przypadku łańcucha znaków, będzie to lista znaków jeden po drugim. Aby ponownie połączyć je w jeden ciąg znaków, użyj metody join().

sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca

Dla tupli, użyj tuple(), która tworzy tuple z listy.

tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)

Ustalenie nasion liczb losowych

Przez podanie dowolnej liczby całkowitej do funkcji seed() modułu random, ziarno liczb losowych może zostać ustalone i generator liczb losowych może zostać zainicjalizowany.

Po inicjalizacji z tym samym ziarnem, jest ono zawsze ponownie uporządkowane w ten sam sposób.

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]