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