938 Stimmen

Mischen einer Liste von Objekten

Ich habe eine Liste von Objekten und möchte sie mischen. Ich dachte, ich könnte die random.shuffle Methode, aber das scheint zu scheitern, wenn die Liste aus Objekten besteht. Gibt es eine Methode zum Mischen von Objekten oder eine andere Möglichkeit, dies zu umgehen?

import random

class A:
    foo = "bar"

a1 = a()
a2 = a()
b = [a1, a2]

print(random.shuffle(b))

Dies wird scheitern.

1485voto

tom10 Punkte 63374

random.shuffle sollte funktionieren. Hier ist ein Beispiel, bei dem die Objekte Listen sind:

from random import shuffle
x = [[i] for i in range(10)]
shuffle(x)

# print(x)  gives  [[9], [2], [7], [0], [4], [5], [3], [1], [8], [6]]
# of course your results will vary

Beachten Sie, dass Shuffle funktioniert an Ort und Stelle und gibt keine zurück.

138voto

Ted Punkte 1489

Wie Sie erfahren haben, war das Mischen der Daten an Ort und Stelle das Problem. Ich habe das Problem auch häufig, und ich scheine auch oft zu vergessen, wie man eine Liste kopiert. Verwendung von sample(a, len(a)) ist die Lösung, wenn man len(a) als der Stichprobenumfang. Siehe https://docs.python.org/3.6/library/random.html#random.sample für die Python-Dokumentation.

Hier ist eine einfache Version mit random.sample() die das gemischte Ergebnis als neue Liste zurückgibt.

import random

a = range(5)
b = random.sample(a, len(a))
print a, b, "two list same:", a == b
# print: [0, 1, 2, 3, 4] [2, 1, 3, 4, 0] two list same: False

# The function sample allows no duplicates.
# Result can be smaller but not larger than the input.
a = range(555)
b = random.sample(a, len(a))
print "no duplicates:", a == list(set(b))

try:
    random.sample(a, len(a) + 1)
except ValueError as e:
    print "Nope!", e

# print: no duplicates: True
# print: Nope! sample larger than population

94voto

Ohad Cohen Punkte 5050

Ich habe auch einige Zeit gebraucht, um das zu verstehen. Aber die Dokumentation für Shuffle ist sehr klar:

Liste mischen x an Ort und Stelle ; return None.

Sie sollten also nicht print(random.shuffle(b)) . Stattdessen tun random.shuffle(b) und dann print(b) .

50voto

Michael Punkte 461
#!/usr/bin/python3

import random

s=list(range(5))
random.shuffle(s) # << shuffle before print or assignment
print(s)

# print: [2, 4, 1, 3, 0]

39voto

fantabolous Punkte 18632

Wenn Sie zufällig Folgendes verwenden numpy (sehr beliebt für wissenschaftliche und finanzielle Anwendungen) können Sie sich einen Import sparen.

import numpy as np    
np.random.shuffle(b)
print(b)

https://numpy.org/doc/stable/reference/random/generated/numpy.random.shuffle.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X