„Python“ sistemoje skaičių sekos maišymas visada buvo naudingas įrankis ir klausimas, kuris taip pat iškilo daugelyje pokalbių apie įmonės įdarbinimą. Žinant daugiau nei vieną metodą tai pasiekti visada gali būti privalumas. Aptarkime tam tikrus būdus, kaip tai galima pasiekti.
Python atsitiktinis maišymas sąraše
Į Python, yra keletas būdų, kaip maišyti sąrašą. Čia yra įvairių Python būdų, kaip maišyti sąrašus.
- Naudojant surūšiuotą()
- Naudojant random.shuffle()
- Naudojant random.sample()
- Atsitiktinės atrankos metodo naudojimas
- Naudojant Fisher-Yates shuffle algoritmą
- Naudojant itertools.permutations() funkciją
- Naudojant NumPy
Atsitiktinai maišyti sąrašą naudojant sorted()
Surūšiuotą sąrašo versiją galima sukurti naudojant surūšiuota () funkcija. Veiksmingai sumaišome elementus atsitiktinai, naudodami juos sumaišyto sąrašo kopijoje.
Python3
eilutė masyve c
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)> |
>
>
Išvestis
Original list: [1, 2, 3, 4, 5] Shuffled list: [2, 3, 4, 5, 1]>
Laiko sudėtingumas: O(nlogn), kur n yra sąrašo ilgis
Erdvės sudėtingumas: O(n), kur n yra sąrašo ilgis
Atsitiktinai sutvarkykite sąrašą naudodami Random.Shuffle()
Random.Shuffle () yra labiausiai rekomenduojamas būdas maišyti sąrašą. Python savo atsitiktinėje bibliotekoje suteikia šią integruotą funkciją, kuri vietoje maišo sąrašą. To trūkumas yra tas, kad šiame procese prarandama sąrašo tvarka. Naudinga kūrėjams, kurie nusprendžia sutaupyti laiko ir pastangų.
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))> |
>
>
Išvestis
The original list is : [1, 4, 5, 6, 3] The shuffled list is : [5, 1, 3, 4, 6]>
Laiko sudėtingumas: O(n), kur n yra sąrašo ilgis
Erdvės sudėtingumas: O(n), kur n yra sąrašo ilgis
Atsitiktinai sudaryti sąrašą u dainuoti Random.Sample()
Atsitiktinis pavyzdys(), Tai gana naudinga funkcija, geresnė nei anksčiau naudotas maišymo metodas, nes sukuria naują maišytą sąrašą ir grąžina jį, o ne trikdo pradinio sąrašo tvarką. Tai naudinga tais atvejais, kai reikia išlaikyti pradinį sąrašą.
Python3
sujungti rūšiuoti java
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))> |
>
>
Išvestis
The original list is : [1, 4, 5, 6, 3] The shuffled list is : [4, 3, 1, 6, 5]>
Laiko sudėtingumas: O(n), kur n yra sąrašo ilgis
Erdvės sudėtingumas: O(n), kur n yra sąrašo ilgis
Atsitiktinai sudarykite sąrašą naudodami atsitiktinio pasirinkimo metodą
Taikydami šį metodą atsitiktinai suskirstysime sąrašą naudodami atsitiktinės atrankos metodas . Atsitiktinai pasirenkame indeksą ir pridedame tą elementą prie sąrašo.
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)> |
>
1nf 2nf 3nf
>
Išvestis
Original List: [1, 2, 3, 4, 5, 6] Shuffled List: [1, 5, 2, 6, 3, 4]>
Laiko sudėtingumas: O(n) čia n yra sąrašo ilgis
Erdvės sudėtingumas: O(1)
Atsitiktinai sumaišykite sąrašą naudodami Fisher-Yates shuffle algoritmą
Tai vienas iš žinomiausių algoritmų Fisher-Yates shuffle algoritmas , daugiausia naudojamas skaičių sekai maišyti Python. Šis algoritmas tiesiog paima didesnę indekso reikšmę ir sukeičia ją dabartine verte, šis procesas kartojasi iki sąrašo pabaigos.
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))> |
>
>
Išvestis
The original list is : [1, 4, 5, 6, 3]The shuffled list is : [3, 4, 5, 6, 1]>
Laiko sudėtingumas: O(n), kur n yra sąrašo ilgis
Erdvės sudėtingumas: O(n), kur n yra sąrašo ilgis
Atsitiktinai sutvarkykite sąrašą naudodami funkciją Itertools.Permutations()
Šis metodas sugeneruoja visas galimas pradinio sąrašo permutacijas naudojant itertools.permutations() funkciją, tada pasirinkite atsitiktinį.
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)> |
>
>
Išvestis
Shuffled list: (6, 5, 4, 1, 3)>
Laiko sudėtingumas: O(n!) kur n yra sąrašo ilgis, atsirandantis dėl visų galimų permutacijų.
Erdvės sudėtingumas: O(n!), nes visos galimos permutacijos generuojamos ir saugomos sąraše.
Atsitiktinai sudarykite sąrašą naudojant Numpy
Mes naudojame NumPy() norėdami sumaišyti sąrašo elementus. Norėdami atsitiktinai suskirstyti sąrašą naudodami numpy, turime konvertuoti sąrašą į NumPy masyvą, tada pritaikyti mažinimo funkciją, kuri grąžina sumaišytą sąrašą ir išspausdina sumaišytą sąrašą.
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()))> |
>
>
mašinraščio datos tipas
Išvestis
The original list is : [1, 4, 5, 6, 3] The shuffled list is : [3, 6, 1, 5, 4]>
Laiko sudėtingumas: Reduction() funkcijos laiko sudėtingumas priklauso nuo iteracijų skaičiaus, kuris yra lygus sąrašo ilgiui. np.random.permutation() laiko sudėtingumas yra O(n), kur n yra įvesties masyvo ilgis. Todėl šio kodo laiko sudėtingumas yra O(n^2).
Erdvės sudėtingumas: Šio kodo sudėtingumas priklauso nuo sąrašo dydžio. Sąrašas išsaugomas atmintyje kartu su keliais papildomais kintamaisiais, kuriuos naudoja redukcijos () funkcija. Todėl erdvės sudėtingumas yra O (n).