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