オブジェクトのリストがあり、それらをシャッフルしたいと考えています。メソッドが使えると思っrandom.shuffle
たのですが、リストがオブジェクトの場合に失敗するようです。オブジェクトをシャッフルする方法、またはこれを回避する別の方法はありますか?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
これは失敗します。
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 を返すことに注意してください。
あなたが学んだように、インプレースシャッフルが問題でした。私も頻繁に問題を抱えており、リストのコピー方法も忘れているようです。サンプルサイズとして使用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
私もそれを得るのに時間がかかりました。しかし、シャッフルのドキュメントは非常に明確です。
シャッフル リスト xを配置します。戻り値なし。
だからあなたはすべきではありませんprint(random.shuffle(b))
。代わりに、しrandom.shuffle(b)
てからprint(b)
.
#!/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]
>>> import random
>>> a = ['hi','world','cat','dog']
>>> random.shuffle(a,random.random)
>>> a
['hi', 'cat', 'dog', 'world']
それは私にとってはうまくいきます。必ずランダム方式を設定してください。
ワンライナーの場合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]
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]])
( vsshuffled
と同じ意味で)と呼ばれる関数を定義できます。sort
sorted
def shuffled(x):
import random
y = x[:]
random.shuffle(y)
return y
x = shuffled([1, 2, 3, 4])
print x
ソース ファイルに random.py という名前を付けていないこと、および作業ディレクトリに random.pyc. という名前のファイルがないことを確認してください。プログラムが pythons random モジュールの代わりにローカルの random.py ファイルをインポートしようとする可能性があります。 .
それは正常に動作します。ここでは、関数をリスト オブジェクトとして使用して試しています。
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 の順序はランダムです)