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.

25voto

Dan Lorenc Punkte 5340
>>> import random
>>> a = ['hi','world','cat','dog']
>>> random.shuffle(a,random.random)
>>> a
['hi', 'cat', 'dog', 'world']

Bei mir funktioniert es einwandfrei. Stellen Sie sicher, dass Sie die Zufallsmethode einstellen.

17voto

Martin Thoma Punkte 105621

Wenn Sie mehrere Listen haben, sollten Sie die Permutation (die Art und Weise, wie Sie die Liste mischen / die Elemente in der Liste neu anordnen) zuerst definieren und dann auf alle Listen anwenden:

import random

perm = list(range(len(list_one)))
random.shuffle(perm)
list_one = [list_one[index] for index in perm]
list_two = [list_two[index] for index in perm]

Numpy / Scipy

Wenn Ihre Listen Numpy-Arrays sind, ist es einfacher:

import numpy as np

perm = np.random.permutation(len(list_one))
list_one = list_one[perm]
list_two = list_two[perm]

mpu

Ich habe das kleine Hilfspaket erstellt mpu die die consistent_shuffle Funktion:

import mpu

# Necessary if you want consistent results
import random
random.seed(8)

# Define example lists
list_one = [1,2,3]
list_two = ['a', 'b', 'c']

# Call the function
list_one, list_two = mpu.consistent_shuffle(list_one, list_two)

Beachten Sie, dass mpu.consistent_shuffle nimmt eine beliebige Anzahl von Argumenten entgegen. Sie können also auch drei oder mehr Listen damit mischen.

14voto

weiyixie Punkte 495

Bei Einzeilern verwenden Sie random.sample(list_to_be_shuffled, length_of_the_list) mit einem Beispiel:

import random
random.sample(list(range(10)), 10)

Ausgänge: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]

13voto

Jeff Punkte 512
from random import random
my_list = range(10)
shuffled_list = sorted(my_list, key=lambda x: random())

Diese Alternative kann für einige Anwendungen nützlich sein, bei denen Sie die Bestellfunktion austauschen möchten.

10voto

Gordon Bean Punkte 3716

In einigen Fällen, in denen Numpy-Arrays verwendet werden, kann die Verwendung von random.shuffle doppelte Daten in dem Array erstellt.

Eine Alternative ist die Verwendung von numpy.random.shuffle . Wenn Sie bereits mit Numpy arbeiten, ist dies die bevorzugte Methode gegenüber der generischen random.shuffle .

numpy.random.shuffle

Beispiel

>>> import numpy as np
>>> import random

使用方法 random.shuffle :

>>> foo = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> foo

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

>>> random.shuffle(foo)
>>> foo

array([[1, 2, 3],
       [1, 2, 3],
       [4, 5, 6]])

使用方法 numpy.random.shuffle :

>>> foo = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> foo

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

>>> np.random.shuffle(foo)
>>> foo

array([[1, 2, 3],
       [7, 8, 9],
       [4, 5, 6]])

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