Python | Načini premešanja seznama

V Pythonu je bilo mešanje zaporedja številk vedno koristen pripomoček in vprašanje, ki se je pojavilo tudi na številnih razgovorih za zaposlitev v podjetju. Poznavanje več kot ene metode za dosego tega je vedno lahko plus. Razpravljajmo o nekaterih načinih, kako je to mogoče doseči.

Python naključno premeša seznam

noter Python, seznam lahko premešate na več načinov. Tukaj so različni načini Python za mešanje seznamov.

  • Uporaba sorted()
  • Uporaba random.shuffle()
  • Uporaba random.sample()
  • Uporaba metode naključnega izbora
  • Uporaba Fisher-Yatesovega algoritma shuffle
  • Uporaba funkcije itertools.permutations().
  • Uporaba NumPy

Naključno premešaj seznam z uporabo sorted()

Razvrščeno različico seznama lahko ustvarite z uporabo razvrščeno() funkcijo. Elemente dejansko naključno premešamo tako, da jih uporabimo na kopiji seznama, ki je bil premešan.

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)>

Izhod

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

Časovna zapletenost: O(nlogn), kjer je n dolžina seznama
Kompleksnost prostora: O(n), kjer je n dolžina seznama

Naključno uredite seznam z uporabo Random.Shuffle()

Random.Shuffle() je najbolj priporočljiva metoda za mešanje seznama. Python v svoji naključni knjižnici nudi to vgrajeno funkcijo, ki na mestu premeša seznam. Pomanjkljivost tega je, da se v tem procesu izgubi vrstni red seznama. Uporabno za razvijalce, ki se odločijo prihraniti čas in vrvež.

Python3




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))>

Izhod

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

Časovna zapletenost: O(n), kjer je n dolžina seznama
Kompleksnost prostora: O(n), kjer je n dolžina seznama

Naključni seznam u poj Random.Sample()

Random.Sample(), To je precej uporabna funkcija, boljša od metode naključnega predvajanja, uporabljene zgoraj, v tem smislu, da ustvari nov premešan seznam in ga vrne, namesto da bi motil vrstni red prvotnega seznama. To je uporabno v primerih, ko moramo obdržati izvirni seznam.

Python3




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))>

Izhod

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

Časovna zapletenost: O(n), kjer je n dolžina seznama
Kompleksnost prostora: O(n), kjer je n dolžina seznama

Naključno uredite seznam z metodo naključnega izbora

Pri tej metodi bomo naključno razvrstili seznam z uporabo metoda naključnega izbora . Indeks izberemo naključno in ta element pri tem indeksu dodamo na seznam.

Python3




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)>

Izhod

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

Časovna zapletenost: O(n), kjer je n dolžina seznama
Kompleksnost prostora: O(1)

Naključno premešaj seznam z uporabo Fisher-Yatesovega algoritma premešanja

To je eden od znanih algoritmov, ki je Algoritem Fisher-Yates Shuffle , ki se večinoma uporablja za mešanje zaporedja številk v Pythonu. Ta algoritem samo vzame višjo vrednost indeksa in jo zamenja s trenutno vrednostjo, ta postopek se ponavlja v zanki do konca seznama.

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))>

Izhod

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

Časovna zapletenost: O(n), kjer je n dolžina seznama
Kompleksnost prostora: O(n), kjer je n dolžina seznama

Naključno uredite seznam s funkcijo Itertools.Permutations().

Ta metoda ustvari vse možne permutacije prvotnega seznama z uporabo itertools.permutations() funkcijo in nato izberite naključno.

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)>

Izhod

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

Časovna zapletenost: O(n!), kjer je n dolžina seznama zaradi generiranja vseh možnih permutacij.
Kompleksnost prostora: O(n!), ker so vse možne permutacije ustvarjene in shranjene na seznamu.

Naključni seznam z uporabo Numpyja

Uporabljamo NumPy() za premešanje elementov na seznamu. Če želite naključno razvrstiti seznam z uporabo numpy, moramo seznam pretvoriti v matriko NumPy in nato uporabiti funkcijo za zmanjšanje, ki vrne premešani seznam in natisne premešani seznam.

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()))>

Izhod

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

Časovna zapletenost: Časovna zahtevnost funkcije reduce() je odvisna od števila iteracij, ki je enako dolžini seznama. Časovna kompleksnost np.random.permutation() je O(n), kjer je n dolžina vhodne matrike. Zato je časovna kompleksnost te kode O(n^2).
Kompleksnost prostora: Prostorska kompleksnost te kode je odvisna od velikosti seznama. Seznam je shranjen v pomnilniku skupaj z nekaj dodatnimi spremenljivkami, ki jih uporablja funkcija reduce(). Zato je kompleksnost prostora O(n).