Ich habe eine Liste von Objekten und möchte sie mischen. Ich dachte, ich könnte die random.shuffle
Methode verwenden, aber dies scheint zu scheitern, wenn die Liste Objekte enthält. Gibt es eine Methode zum Mischen von Objekten oder einen anderen Weg, um dies zu umgehen?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
Dies wird fehlschlagen.
Antworten:
random.shuffle
sollte arbeiten. Hier ist ein Beispiel, in dem die Objekte Listen sind:Beachten Sie, dass Shuffle an Ort und Stelle funktioniert und None zurückgibt.
quelle
random
Dokumentation des Moduls ausführlich beschrieben .random.sample(x, len(x))
eine Kopie verwenden oder einfach nur erstellenshuffle
. Fürlist.sort
die es ein ähnliches Problem gibt, gibt es jetztlist.sorted
, aber es gibt keine ähnliche Variante fürshuffle
.from random import SystemRandom
stattdessen; fügecryptorand = SystemRandom()
Zeile 3 hinzu und ändere sie aufcryptorand.shuffle(x)
Wie Sie erfahren haben, war das Mischen an Ort und Stelle das Problem. Ich habe auch häufig Probleme und scheine oft zu vergessen, wie man eine Liste kopiert. Verwenden
sample(a, len(a))
ist die Lösung, wobeilen(a)
als Stichprobengröße verwendet wird. Die Python-Dokumentation finden Sie unter https://docs.python.org/3.6/library/random.html#random.sample .Hier ist eine einfache Version,
random.sample()
die das gemischte Ergebnis als neue Liste zurückgibt.quelle
old = [1,2,3,4,5]; new = list(old); random.shuffle(new); print(old); print(new)
(ersetzen; durch Zeilenumbrüche)old[:]
könnte auch eine flache Kopie für die Liste machenold
.sample()
ist besonders hilfreich für das Prototyping einer Datenanalyse.sample(data, 2)
um den Klebercode einer Pipeline einzurichten und ihn dann schrittweise zu "erweitern"len(data)
.Ich habe einige Zeit gebraucht, um das auch zu bekommen. Die Dokumentation für Shuffle ist jedoch sehr klar:
Also solltest du nicht
print(random.shuffle(b))
. Stattdessenrandom.shuffle(b)
und dannprint(b)
.quelle
quelle
Wenn Sie bereits numpy verwenden (sehr beliebt für wissenschaftliche und finanzielle Anwendungen), können Sie sich einen Import sparen.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
quelle
Es funktioniert gut für mich. Stellen Sie sicher, dass Sie die Zufallsmethode festlegen.
quelle
Wenn Sie mehrere Listen haben, möchten Sie möglicherweise zuerst die Permutation definieren (die Art und Weise, wie Sie die Liste mischen / die Elemente in der Liste neu anordnen) und sie dann auf alle Listen anwenden:
Numpy / Scipy
Wenn Ihre Listen numpy Arrays sind, ist es einfacher:
mpu
Ich habe das kleine Dienstprogrammpaket erstellt,
mpu
das dieconsistent_shuffle
Funktion hat:Beachten Sie, dass
mpu.consistent_shuffle
eine beliebige Anzahl von Argumenten erforderlich ist. Sie können also auch drei oder mehr Listen damit mischen.quelle
Diese Alternative kann für einige Anwendungen nützlich sein, bei denen Sie die Bestellfunktion austauschen möchten.
quelle
sorted
ein funktionales Shuffle ist (wenn Sie sich für solche Dinge interessieren).In einigen Fällen werden bei Verwendung von Numpy-Arrays
random.shuffle
doppelte Daten im Array erstellt.Eine Alternative ist zu verwenden
numpy.random.shuffle
. Wenn Sie bereits mit numpy arbeiten, ist dies die bevorzugte Methode gegenüber der generischenrandom.shuffle
.numpy.random.shuffle
Beispiel
Verwenden von
random.shuffle
:Verwenden von
numpy.random.shuffle
:quelle
numpy.random.permutation
von Interesse sein kann: stackoverflow.com/questions/15474159/shuffle-vs-permute-numpyrandom.shuffle
Dokumentation sollte schreien Nicht mit numpy Arrays verwendenVerwenden Sie für Einzeiler
random.sample(list_to_be_shuffled, length_of_the_list)
ein Beispiel:Ausgänge: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]
quelle
'print func (foo)' gibt den Rückgabewert von 'func' aus, wenn er mit 'foo' aufgerufen wird. 'shuffle' hat jedoch None als Rückgabetyp, da die Liste an Ort und Stelle geändert wird und daher nichts gedruckt wird. Problemumgehung:
Wenn Sie sich mehr für funktionalen Programmierstil interessieren, möchten Sie möglicherweise die folgende Wrapper-Funktion ausführen:
quelle
random.sample(ls, len(ls))
wenn Sie diesen Weg wirklich gehen möchten.Man kann eine Funktion definieren, die aufgerufen wird
shuffled
(im gleichen Sinne wiesort
vssorted
).quelle
shuffle
ist vorhanden, drucken Sie also nicht das ErgebnisNone
, sondern die Liste.quelle
Sie können dies tun:
Wenn Sie zu zwei Listen zurückkehren möchten, teilen Sie diese lange Liste in zwei auf.
quelle
Sie können eine Funktion erstellen, die eine Liste als Parameter verwendet und eine gemischte Version der Liste zurückgibt:
quelle
quelle
Sie können entweder Shuffle oder Sample verwenden. beide stammen aus zufälligen Modulen.
ODER
quelle
Stellen Sie sicher, dass Sie Ihre Quelldatei nicht random.py benennen und dass sich in Ihrem Arbeitsverzeichnis keine Datei mit dem Namen random.pyc befindet. Dies kann auch dazu führen, dass Ihr Programm versucht, Ihre lokale random.py-Datei anstelle des Python-Zufallsmoduls zu importieren .
quelle
quelle
_list.extend(list2)
, was prägnanter UND effizienter ist.quelle
Der Mischvorgang erfolgt "mit Ersatz" , daher kann sich das Auftreten jedes Artikels ändern! Zumindest wenn Elemente in Ihrer Liste auch Liste sind.
Z.B,
Nach,
Die Anzahl von [0] kann 9 oder 8 sein, aber nicht genau 10.
quelle
Plan: Schreiben Sie das Shuffle auf, ohne sich auf eine Bibliothek verlassen zu müssen, um das schwere Heben durchzuführen. Beispiel: Gehen Sie die Liste von Anfang an durch, beginnend mit Element 0; Suchen Sie eine neue zufällige Position dafür, z. B. 6, setzen Sie den Wert 0 in 6 und den Wert 6 in 0. Fahren Sie mit Element 1 fort und wiederholen Sie diesen Vorgang usw. im Rest der Liste
quelle
my_list[i], my_list[j] = my_list[j], my_list[i]
Es funktioniert gut. Ich versuche es hier mit Funktionen als Listenobjekte:
Es wird ausgedruckt: foo1 foo2 foo3 foo2 foo3 foo1 (die foos in der letzten Zeile haben eine zufällige Reihenfolge)
quelle