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?

Roee Adler
quelle
2
Mögliches Duplikat von Mischen einer Liste von Objekten in Python
bigOther

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]
John Kugelman
quelle
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))])
Yann VR
quelle
3

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

Charles Ma
quelle
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)
inti pires
quelle
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)
Mikeologe
quelle