Найкращий спосіб рандомізувати список рядків у Python


79

Я отримую в якості введення список рядків і мені потрібно повернути список із тими самими рядками, але в рандомізованому порядку. Я повинен дозволити дублікати - однаковий рядок може з'являтися один або кілька разів у вхідних даних і повинен мати однакову кількість разів у вихідних даних.

Я бачу кілька способів "грубої сили" (за допомогою циклів, не дай Бог), один із яких я використовую зараз. Однак, знаючи Python, мабуть, класний однокласник справді робить роботу, чи не так?


Відповіді:


204
>>> import random
>>> x = [1, 2, 3, 4, 3, 4]
>>> random.shuffle(x)
>>> x
[4, 4, 3, 1, 2, 3]
>>> random.shuffle(x)
>>> x
[3, 4, 2, 1, 3, 4]

1
random.shuffle (range (5)) .., схоже, не працює зі створеним на льоту списком :(
sten

7
@ user1019129 random.shuffleперемішує списки на місці. У Python 3 range(5)- це генератор, а не список. У Python 2 range(5)є список, але перетасовка на місці, тому він перемішує тимчасовий список, який негайно викидається. Ви можете робити, x = range(5); random.shuffle(x)а потім використовувати x.
Джон Кугельман,


7

Отримавши елемент рядка , ось однорядковий:

''.join([str(w) for w in random.sample(item, len(item))])

3

Вам доведеться зчитувати рядки в масив, а потім використовувати алгоритм перетасовки. Я рекомендую перетасувати Fisher-Yates


1
На основі огляду статті у Вікіпедії, схоже, це все-таки більш-менш те, що він робить. Ви можете прочитати код у C: \ Python26 \ Lib \ random.py (або еквівалент для інших ОС), і схоже, він робить те саме, що описано тут: en.wikipedia.org/wiki/…
MatrixFrog

0
import random

b = []
a = int(input(print("How many items you want to shuffle? ")))
for i in range(0, a):
    n = input('Please enter a item: ')
    b.append(n)

random.shuffle(b)

print(b)

0

У python 3.8 ви можете використовувати морж, щоб допомогти його втиснути у пару рядків Спочатку вам потрібно створити список із рядка та зберегти його у змінну. Тоді ви можете скористатися випадковим чином, щоб перетасувати його. Потім просто приєднайте список назад до рядка.

random.shuffle(x := list("abcdefghijklmnopqrstuvwxyz"))
x = "".join(x)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.