logo

Pythona | Sposoby tasowania listy

W Pythonie tasowanie sekwencji liczb zawsze było użytecznym narzędziem i pytaniem, które pojawiało się również podczas wielu rozmów kwalifikacyjnych w firmie. Znajomość więcej niż jednej metody osiągnięcia tego zawsze może być zaletą. Omówmy pewne sposoby, w jakie można to osiągnąć.

Losowe losowe przetasowanie listy w Pythonie

W Pyton, istnieje kilka sposobów przetasowania listy. Oto różne sposoby Pythona na tasowanie list.



  • Korzystanie z sortowanej()
  • Używanie random.shuffle()
  • Używanie random.sample()
  • Korzystanie z metody losowego wyboru
  • Korzystanie z algorytmu tasowania Fishera-Yatesa
  • Korzystanie z funkcji itertools.permutations().
  • Korzystanie z NumPy

Losowe przetasowanie listy za pomocą sorted()

Posortowaną wersję listy można utworzyć za pomocą metody posortowane() funkcjonować. Skutecznie tasujemy elementy losowo, używając ich na kopii przetasowanej listy.

Python3








import> random> my_list>=> [>1>,>2>,>3>,>4>,>5>]> shuffled_list>=> sorted>(my_list, key>=>lambda> x: random.random())> print>(>'Original list:'>, my_list)> print>(>'Shuffled list:'>, shuffled_list)>

>

>

Wyjście

Original list: [1, 2, 3, 4, 5] Shuffled list: [2, 3, 4, 5, 1]>

Złożoność czasowa: O(nlogn), gdzie n jest długością listy
Złożoność przestrzeni: O(n), gdzie n jest długością listy

Losuj listę za pomocą Random.Shuffle()

Losowo. Losowo() to najbardziej zalecana metoda tasowania listy. Python w swojej losowej bibliotece udostępnia tę wbudowaną funkcję, która na miejscu tasuje listę. Wadą tego jest to, że w tym procesie traci się kolejność list. Przydatne dla programistów, którzy chcą zaoszczędzić czas i wysiłek.

Python3


tablica obiektów Java



import> random> test_list>=> [>1>,>4>,>5>,>6>,>3>]> print>(>'The original list is : '> +> str>(test_list))> # using random.shuffle() to shuffle a list> random.shuffle(test_list)> print>(>'The shuffled list is : '> +> str>(test_list))>

>

>

Wyjście

The original list is : [1, 4, 5, 6, 3] The shuffled list is : [5, 1, 3, 4, 6]>

Złożoność czasowa: O(n), gdzie n jest długością listy
Złożoność przestrzeni: O(n), gdzie n jest długością listy

Losuj listę u śpiewaj Random.Sample()

Losowa próbka(), Jest to całkiem przydatna funkcja, lepsza niż metoda tasowania zastosowana powyżej w tym sensie, że tworzy nową przetasowaną listę i zwraca ją, zamiast zakłócać porządek oryginalnej listy. Jest to przydatne w przypadkach, gdy chcemy zachować oryginalną listę.

Python3

tutoriale z Javy




import> random> test_list>=> [>1>,>4>,>5>,>6>,>3>]> print>(>'The original list is : '> +> str>(test_list))> # using random.sample()to shuffle a list> res>=> random.sample(test_list,>len>(test_list))> print>(>'The shuffled list is : '> +> str>(res))>

>

>

Wyjście

The original list is : [1, 4, 5, 6, 3] The shuffled list is : [4, 3, 1, 6, 5]>

Złożoność czasowa: O(n), gdzie n jest długością listy
Złożoność przestrzeni: O(n), gdzie n jest długością listy

Losuj listę za pomocą metody losowego wyboru

W tej metodzie będziemy losować listę za pomocą metoda losowego wyboru . Wybieramy indeks losowo i dołączamy ten element do listy.

Python3




Bourne znowu skorupa
import> random> arr>=> [>1>,>2>,>3>,>4>,>5>,>6>]> print>(>'Original List: '>, arr)> n>=> len>(arr)> for> i>in> range>(n):> >j>=> random.randint(>0>, n>->1>)> >element>=> arr.pop(j)> >arr.append(element)> > print>(>'Shuffled List: '>, arr)>

>

>

Wyjście

Original List: [1, 2, 3, 4, 5, 6] Shuffled List: [1, 5, 2, 6, 3, 4]>

Złożoność czasowa: O(n) gdzie n jest długością listy
Złożoność przestrzeni: O(1)

Losowe przetasowanie listy przy użyciu algorytmu przetasowania Fishera-Yatesa

Jest to jeden ze znanych algorytmów Algorytm tasowania Fishera-Yatesa , używany głównie do tasowania sekwencji liczb w Pythonie. Algorytm ten po prostu pobiera wyższą wartość indeksu i zamienia ją z bieżącą wartością, proces ten powtarza się w pętli aż do końca listy.

Python3




import> random> test_list>=> [>1>,>4>,>5>,>6>,>3>]> print>(>'The original list is : '> +> str>(test_list))> # using Fisher–Yates shuffle Algorithm to shuffle a list> for> i>in> range>(>len>(test_list)>->1>,>0>,>->1>):> ># Pick a random index from 0 to i> >j>=> random.randint(>0>, i>+> 1>)> ># Swap arr[i] with the element at random index> >test_list[i], test_list[j]>=> test_list[j], test_list[i]> print>(>'The shuffled list is : '> +> str>(test_list))>

>

kolejność sql według daty
>

Wyjście

The original list is : [1, 4, 5, 6, 3]The shuffled list is : [3, 4, 5, 6, 1]>

Złożoność czasowa: O(n), gdzie n jest długością listy
Złożoność przestrzeni: O(n), gdzie n jest długością listy

Losuj listę za pomocą funkcji Itertools.Permutations().

Ta metoda generuje wszystkie możliwe permutacje oryginalnej listy za pomocą itertools.permutations() funkcję, a następnie wybierz losową.

Python3




import> random> import> itertools> lst>=> [>1>,>4>,>5>,>6>,>3>]> permutations>=> list>(itertools.permutations(lst))> shuffled_lst>=> random.choice(permutations)> print>(>'Shuffled list:'>, shuffled_lst)>

>

>

Wyjście

Shuffled list: (6, 5, 4, 1, 3)>

Złożoność czasowa: O(n!) gdzie n jest długością listy, wynikającą z wygenerowania wszystkich możliwych permutacji.
Złożoność przestrzeni: O(n!), ponieważ wszystkie możliwe permutacje są generowane i przechowywane na liście.

Losuj listę za pomocą Numpy’ego

Używamy NumPy() aby przetasować elementy na liście. Aby losować listę za pomocą numpy, musimy przekonwertować listę na tablicę NumPy, a następnie zastosować funkcję zmniejszania, która zwraca przetasowaną listę i drukuje przetasowaną listę.

Python3




import> numpy as np> from> functools>import> reduce> test_list>=> [>1>,>4>,>5>,>6>,>3>]> # Printing original list> print>(>'The original list is : '> +> str>(test_list))> # using reduce() and numpy to shuffle a list> res>=> reduce>(>lambda> acc, _: np.random.permutation(acc),> >range>(>len>(test_list)), np.array(test_list))> print>(>'The shuffled list is : '> +> str>(res.tolist()))>

tworzenie tabel w lateksie
>

>

Wyjście

The original list is : [1, 4, 5, 6, 3] The shuffled list is : [3, 6, 1, 5, 4]>

Złożoność czasowa: Złożoność czasowa funkcji redukcji() zależy od liczby iteracji, która jest równa długości listy. Złożoność czasowa np.random.permutation() wynosi O(n), gdzie n jest długością tablicy wejściowej. Dlatego złożoność czasowa tego kodu wynosi O(n^2).
Złożoność przestrzeni: Złożoność przestrzenna tego kodu zależy od rozmiaru listy. Lista jest przechowywana w pamięci wraz z kilkoma dodatkowymi zmiennymi używanymi przez funkcję redukcji(). Dlatego złożoność przestrzenna wynosi O (n).