860

オブジェクトのリストがあり、それらをシャッフルしたいと考えています。メソッドが使えると思っrandom.shuffleたのですが、リストがオブジェクトの場合に失敗するようです。オブジェクトをシャッフルする方法、またはこれを回避する別の方法はありますか?

import random

class A:
    foo = "bar"

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

print(random.shuffle(b))

これは失敗します。

4

24 に答える 24

1369

random.shuffle動作するはずです。オブジェクトがリストである例を次に示します。

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

シャッフルはそので機能し、None を返すことに注意してください。

于 2009-06-10T17:03:37.447 に答える
129

あなたが学んだように、インプレースシャッフルが問題でした。私も頻繁に問題を抱えており、リストのコピー方法も忘れているようです。サンプルサイズとして使用sample(a, len(a))することは解決策です。Python ドキュメントについては、https://docs.python.org/3.6/library/random.html#random.samplelen(a)を参照してください。

random.sample()これは、シャッフルされた結果を新しいリストとして返す単純なバージョンです。

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
于 2012-10-19T16:50:08.050 に答える
74

私もそれを得るのに時間がかかりました。しかし、シャッフルのドキュメントは非常に明確です。

シャッフル リスト xを配置します。戻り値なし。

だからあなたはすべきではありませんprint(random.shuffle(b))。代わりに、しrandom.shuffle(b)てからprint(b).

于 2014-11-21T14:49:30.740 に答える
46
#!/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]
于 2010-12-04T12:46:10.337 に答える
25
>>> import random
>>> a = ['hi','world','cat','dog']
>>> random.shuffle(a,random.random)
>>> a
['hi', 'cat', 'dog', 'world']

それは私にとってはうまくいきます。必ずランダム方式を設定してください。

于 2009-06-10T17:04:16.930 に答える
12

ワンライナーの場合random.sample(list_to_be_shuffled, length_of_the_list)は、例で使用します。

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

出力: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]

于 2018-09-17T15:59:05.203 に答える
10

numpy 配列を使用する場合random.shuffle、配列内に作成された重複データを使用する場合があります。

別の方法は、 を使用することnumpy.random.shuffleです。すでに numpy を使用している場合、これはジェネリックよりも推奨される方法random.shuffleです。

numpy.random.shuffle

>>> 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]])
于 2016-12-19T17:01:26.610 に答える
5

( vsshuffledと同じ意味で)と呼ばれる関数を定義できます。sortsorted

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

x = shuffled([1, 2, 3, 4])
print x
于 2016-05-06T00:48:25.397 に答える
0

ソース ファイルに random.py という名前を付けていないこと、および作業ディレクトリに random.pyc. という名前のファイルがないことを確認してください。プログラムが pythons random モジュールの代わりにローカルの random.py ファイルをインポートしようとする可能性があります。 .

于 2014-02-11T16:59:01.817 に答える
-2

それは正常に動作します。ここでは、関数をリスト オブジェクトとして使用して試しています。

    from random import shuffle

    def foo1():
        print "foo1",

    def foo2():
        print "foo2",

    def foo3():
        print "foo3",

    A=[foo1,foo2,foo3]

    for x in A:
        x()

    print "\r"

    shuffle(A)
    for y in A:
        y()

foo1 foo2 foo3 foo2 foo3 foo1 (最後の行の foo の順序はランダムです)

于 2014-06-28T06:11:44.590 に答える