it-swarm.com.de

Eine Liste von Objekten mischen

Ich habe eine Liste von Objekten in Python 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 eine andere Methode, um dies zu umgehen?

import random

class a:
    foo = "bar"

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

print random.shuffle(b)

Dies wird fehlschlagen.

693
utdiscant

random.shuffle sollte funktionieren. Hier ist ein Beispiel, in 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 an der richtigen Stelle funktioniert und None zurückgibt.

1140
tom10

Wie Sie erfahren haben, war das Mischen vor Ort das Problem. Ich habe auch häufig Probleme und habe oft vergessen, wie man eine Liste kopiert. Die Verwendung von sample(a, len(a)) ist die Lösung, wobei len(a) als Stichprobengröße verwendet wird. 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
104
Ted

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

shuffle-Liste x an Ort und Stelle; return Keine.

Sie sollten also nicht print random.shuffle(b). Führen Sie stattdessen random.shuffle(b) und dann print b aus.

48
Ohad Cohen
#!/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]
35
Michael

Wenn Sie Numpy bereits verwenden (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)

http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html

26
fantabolous
>>> import random
>>> a = ['hi','world','cat','dog']
>>> random.shuffle(a,random.random)
>>> a
['hi', 'cat', 'dog', 'world']

Es funktioniert gut für mich. Stellen Sie sicher, dass Sie die Zufallsmethode festlegen.

22
Dan Lorenc

Wenn Sie mehrere Listen haben, möchten Sie möglicherweise zuerst die Permutation (die Art und Weise, wie Sie die Liste mischen/die Elemente in der Liste neu anordnen) 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 mpu erstellt, das die Funktion consistent_shuffle hat:

_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_ eine beliebige Anzahl von Argumenten akzeptiert. Sie können also auch drei oder mehr Listen damit mischen.

11
Martin Thoma
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.

8
Jeff

In einigen Fällen wurden bei Verwendung von numpy-Arrays mit random.shuffle doppelte Daten im 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 Methode random.shuffle.

numpy.random.shuffle

Beispiel

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

random.shuffle verwenden:

>>> 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 verwenden:

>>> 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]])
6
Gordon Bean

'print func (foo)' gibt den Rückgabewert von 'func' aus, wenn es 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:

# shuffle the list in place 
random.shuffle(b)

# print it
print(b)

Wenn Sie sich mehr mit funktionaler Programmierung beschäftigen, können Sie die folgende Wrapper-Funktion verwenden:

def myshuffle(ls):
    random.shuffle(ls)
    return ls
5
JonDoe

Man kann eine Funktion mit dem Namen shuffled definieren (im gleichen Sinne wie sort vs sorted)

def shuffled(x):
    import random
    y = x[:]
    random.shuffle(y)
    return y

x = shuffled([1, 2, 3, 4])
print x
3
malbarbo

Verwenden Sie für Einzeiler 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]

3
weiyixie
import random

class a:
    foo = "bar"

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

random.shuffle(b)
print(b)

shuffle ist vorhanden, drucken Sie also nicht das Ergebnis, das None ist, sondern die Liste.

2
ravi tanwar

sie können eine Funktion erstellen, die eine Liste als Parameter verwendet und eine gemischte Version der Liste zurückgibt:

from random import *

def listshuffler(inputlist):
    for i in range(len(inputlist)):
        swap = randint(0,len(inputlist)-1)
        temp = inputlist[swap]
        inputlist[swap] = inputlist[i]
        inputlist[i] = temp
    return inputlist
0
user8327014
def shuffle(_list):
    if not _list == []:
        import random
        list2 = []
        while _list != []:
            card = random.choice(_list)
            _list.remove(card)
            list2.append(card)
        while list2 != []:
            card1 = list2[0]
            list2.remove(card1)
            _list.append(card1)
        return _list
0
Pogramist

Sie können dafür gehen:

>>> A = ['r','a','n','d','o','m']
>>> B = [1,2,3,4,5,6]
>>> import random
>>> random.sample(A+B, len(A+B))
[3, 'r', 4, 'n', 6, 5, 'm', 2, 1, 'a', 'o', 'd']

wenn Sie zu zwei Listen zurückkehren möchten, teilen Sie diese lange Liste in zwei auf.

0
kiriloff

Stellen Sie sicher, dass Sie Ihre Quelldatei random.py nicht 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 Pythons-Zufallsmoduls zu importieren .

0
user3298224
""" to shuffle random, set random= True """

def shuffle(x,random=False):
     shuffled = []
     ma = x
     if random == True:
         rando = [ma[i] for i in np.random.randint(0,len(ma),len(ma))]
         return rando
     if random == False:
          for i in range(len(ma)):
          ave = len(ma)//3
          if i < ave:
             shuffled.append(ma[i+ave])
          else:
             shuffled.append(ma[i-ave])    
     return shuffled
0
Josh Anish
import random
class a:
    foo = "bar"

a1 = a()
a2 = a()
b = [a1.foo,a2.foo]
random.shuffle(b)
0
Xavier

sie können entweder shuffle oder sample verwenden. Beide kommen aus dem Zufallsmodul.

import random
def shuffle(arr1):
    n=len(arr1)
    b=random.sample(arr1,n)
    return b

OR

import random
def shuffle(arr1):
    random.shuffle(arr1)
    return arr1
0
ravi tanwar