logo

Python | Sąrašo maišymo būdai

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