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