Python | Способи перемішування списку

У Python перетасування послідовності чисел завжди було корисною утилітою, а також питанням, яке з’являлося на багатьох співбесідах щодо працевлаштування в компанії. Знання кількох методів досягнення цього завжди може бути плюсом. Давайте обговоримо певні способи, якими цього можна досягти.

Випадкове перемішування списку Python

в Python, є кілька способів перетасувати список. Ось різні способи Python для перетасування списків.

  • Використання sorted()
  • Використання random.shuffle()
  • Використання random.sample()
  • Використання методу випадкового вибору
  • Використання алгоритму перетасування Фішера-Єйтса
  • Використання функції itertools.permutations().
  • Використання NumPy

Випадкове перемішування списку за допомогою sorted()

Відсортовану версію списку можна створити за допомогою відсортовано() функція. Ми фактично випадково перемішуємо елементи, використовуючи їх у копії списку, який було перетасовано.

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

Вихід

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

Часова складність: O(nlogn), де n - довжина списку
Космічна складність: O(n), де n - довжина списку

Рандомізуйте список за допомогою Random.Shuffle()

Random.Shuffle() є найбільш рекомендованим методом перетасування списку. Python у своїй довільній бібліотеці надає цю вбудовану функцію, яка на місці перемішує список. Недоліком цього є те, що в цьому процесі втрачається порядок списку. Корисно для розробників, які хочуть заощадити час і суєту.

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

Вихід

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

Часова складність: O(n), де n - довжина списку
Космічна складність: O(n), де n - довжина списку

Рандомізуйте список u співати Random.Sample()

Random.Sample(), Це досить корисна функція, краща за використаний вище метод перемішування в тому аспекті, що вона створює новий перетасований список і повертає його замість того, щоб порушувати порядок вихідного списку. Це корисно у випадках, коли нам потрібно зберегти вихідний список.

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

Вихід

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

Часова складність: O(n), де n - довжина списку
Космічна складність: O(n), де n - довжина списку

Рандомізуйте список за допомогою методу випадкового вибору

У цьому методі ми рандомізуємо список за допомогою метод випадкового відбору . Ми вибираємо індекс випадковим чином і додаємо цей елемент за цим індексом до списку.

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

Вихід

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

Часова складність: O(n), де n - довжина списку
Космічна складність: О(1)

Випадкове перемішування списку за допомогою алгоритму перемішування Фішера-Йейтса

Це один із відомих алгоритмів Алгоритм перетасування Фішера-Йетса , в основному використовується для перемішування послідовності чисел у Python. Цей алгоритм просто бере вище значення індексу та замінює його поточним значенням, цей процес повторюється в циклі до кінця списку.

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

Вихід

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

Часова складність: O(n), де n - довжина списку
Космічна складність: O(n), де n - довжина списку

Рандомізуйте список за допомогою функції Itertools.Permutations().

Цей метод генерує всі можливі перестановки вихідного списку за допомогою itertools.permutations() функцію, а потім виберіть випадкову.

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

Вихід

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

Часова складність: O(n!), де n - довжина списку, завдяки генерації всіх можливих перестановок.
Космічна складність: O(n!), оскільки всі можливі перестановки генеруються та зберігаються у списку.

Рандомізуйте список за допомогою Numpy

Ми використовуємо NumPy() щоб перемішати елементи у списку. Щоб рандомізувати список за допомогою numpy, нам потрібно перетворити список на масив NumPy, а потім застосувати функцію зменшення, яка повертає перетасований список і друкує його.

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

Вихід

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

Часова складність: Часова складність функції reduce() залежить від кількості ітерацій, яка дорівнює довжині списку. Часова складність np.random.permutation() становить O(n), де n — довжина вхідного масиву. Отже, часова складність цього коду становить O(n^2).
Космічна складність: Складність простору цього коду залежить від розміру списку. Список зберігається в пам’яті разом із кількома додатковими змінними, які використовуються функцією reduce(). Отже, просторова складність дорівнює O(n).