Der beste Weg, um eine Liste von Zeichenfolgen in Python zufällig zu sortieren


80

Ich erhalte als Eingabe eine Liste von Zeichenfolgen und muss eine Liste mit denselben Zeichenfolgen zurückgeben, jedoch in zufälliger Reihenfolge. Ich muss Duplikate zulassen - dieselbe Zeichenfolge kann einmal oder mehrmals in der Eingabe erscheinen und muss in der Ausgabe genauso oft vorkommen.

Ich sehe verschiedene "Brute Force" -Methoden (mit Schleifen, Gott bewahre), von denen ich derzeit eine verwende. Wenn Sie jedoch wissen, dass Python einen coolen Einzeiler hat, erledigen Sie den Job, oder?


Antworten:


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)) .. scheint nicht mit on the fly generierten Liste zu funktionieren :(
sten

7
@ user1019129 random.shufflemischt Listen an Ort und Stelle. In Python 3 range(5)ist ein Generator, keine Liste. In Python 2 range(5)ist eine Liste vorhanden, aber das Mischen ist vorhanden, sodass eine temporäre Liste gemischt wird, die sofort weggeworfen wird. Sie können tun x = range(5); random.shuffle(x)und dann verwenden x.
John Kugelman


7

Ein String gegeben Element , hier ist ein Einzeiler:

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

3

Sie müssen die Zeichenfolgen in ein Array einlesen und dann einen Mischalgorithmus verwenden. Ich empfehle Fisher-Yates Shuffle


1
Basierend auf einem Blick auf den Wikipedia-Artikel sieht es so aus, als ob es sowieso mehr oder weniger das ist, was es tut. Sie können den Code in C: \ Python26 \ Lib \ random.py (oder einem gleichwertigen Code für andere Betriebssysteme) lesen und es sieht so aus, als würde er dasselbe tun, was hier beschrieben wird: 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

In Python 3.8 können Sie das Walross verwenden, um es in ein paar Zeilen zu packen. Zuerst müssen Sie eine Liste aus der Zeichenfolge erstellen und in einer Variablen speichern. Dann können Sie zufällig verwenden, um es zu mischen. Fügen Sie dann einfach die Liste wieder zu einer Zeichenfolge zusammen.

random.shuffle(x := list("abcdefghijklmnopqrstuvwxyz"))
x = "".join(x)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.