logo

Python | Způsoby, jak zamíchat seznam

V Pythonu bylo míchání posloupnosti čísel vždy užitečnou pomůckou a také otázkou, která se objevila v mnoha pohovorech o umístění společností. Znalost více než jedné metody, jak toho dosáhnout, může být vždy výhodou. Pojďme diskutovat o určitých způsobech, jak toho lze dosáhnout.

Python Náhodně zamíchat seznam

v Krajta, existuje několik způsobů, jak zamíchat seznam. Zde jsou různé způsoby Pythonu pro míchání seznamů.



  • Pomocí sort()
  • Použití random.shuffle()
  • Použití random.sample()
  • Použití metody náhodného výběru
  • Použití algoritmu Fisher-Yates shuffle
  • Použití funkce itertools.permutations().
  • Pomocí NumPy

Náhodné zamíchání seznamu pomocí sort()

Seřazenou verzi seznamu lze vytvořit pomocí seřazeno() funkce. Prvky efektivně náhodně zamícháme tak, že je použijeme na kopii zamíchaného seznamu.

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

>

>

Výstup

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

Časová náročnost: O(nlogn), kde n je délka seznamu
Prostorová složitost: O(n), kde n je délka seznamu

Randomizace seznamu pomocí Random.Shuffle()

Random.Shuffle() je nejvíce doporučovaná metoda pro zamíchání seznamu. Python ve své náhodné knihovně poskytuje tuto vestavěnou funkci, která na místě zamíchá seznam. Nevýhodou je, že se v tomto procesu ztratí řazení seznamu. Užitečné pro vývojáře, kteří se rozhodli ušetřit čas a shon.

Python3

smazat poslední commit git




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

>

>

Výstup

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

Časová náročnost: O(n), kde n je délka seznamu
Prostorová složitost: O(n), kde n je délka seznamu

Randomizace seznamu u zpívat Random.Sample()

Náhodný vzorek(), To je docela užitečná funkce, lepší než metoda shuffle použitá výše v tom aspektu, že vytvoří nový zamíchaný seznam a vrátí ho, spíše než naruší pořadí původního seznamu. To je užitečné v případech, kdy požadujeme zachovat původní seznam.

Python3

10 nejlepších hentai




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

>

>

Výstup

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

Časová náročnost: O(n), kde n je délka seznamu
Prostorová složitost: O(n), kde n je délka seznamu

Randomizujte seznam pomocí metody náhodného výběru

V této metodě randomizujeme seznam pomocí metoda náhodného výběru . Náhodně vybereme index a přidáme tento prvek k tomuto indexu do seznamu.

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

>

>

Výstup

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

Časová náročnost: O(n) kde n je délka seznamu
Prostorová složitost: O(1)

Náhodné zamíchání seznamu pomocí algoritmu Fisher-Yates Shuffle

Toto je jeden z nejznámějších algoritmů Fisher-Yates Shuffle algoritmus , který se používá hlavně k zamíchání posloupnosti čísel v Pythonu. Tento algoritmus pouze vezme vyšší hodnotu indexu a zamění ji za aktuální hodnotu, tento proces se opakuje ve smyčce až do konce seznamu.

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

>

>

preg_match

Výstup

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

Časová náročnost: O(n), kde n je délka seznamu
Prostorová složitost: O(n), kde n je délka seznamu

Randomizujte seznam pomocí funkce Itertools.Permutations().

Tato metoda generuje všechny možné permutace původního seznamu pomocí itertools.permutations() funkci a poté vyberte náhodnou.

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

>

>

Výstup

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

Časová náročnost: O(n!) kde n je délka seznamu kvůli generování všech možných permutací.
Prostorová složitost: O(n!), protože všechny možné permutace jsou generovány a uloženy v seznamu.

Randomizujte seznam pomocí Numpy

Používáme NumPy() pro zamíchání položek v seznamu. Chcete-li náhodně seznam pomocí numpy, musíme seznam převést na pole NumPy a poté použít funkci snížení a ta vrátí zamíchaný seznam a vytiskne zamíchaný seznam.

Python3

execvp




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

>

>

Výstup

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

Časová náročnost: Časová složitost funkce snížit() závisí na počtu iterací, který se rovná délce seznamu. Časová složitost np.random.permutation() je O(n), kde n je délka vstupního pole. Časová složitost tohoto kódu je tedy O(n^2).
Prostorová složitost: Prostorová složitost tohoto kódu závisí na velikosti seznamu. Seznam je uložen v paměti spolu s několika dalšími proměnnými používanými funkcí reduction(). Prostorová složitost je tedy O(n).