38

他のリストの対応を壊すことなく、2つの関連リストをランダムにシャッフルするより良い方法はありますか?関連する質問を見つけましたが、まったく同じではnumpy.arrayありません。c#

最初の試みとして、簡単なzipトリックで次のことができます。

import random
a = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
b = [2, 4, 6, 8, 10]
c = zip(a, b)
random.shuffle(c)
a = [e[0] for e in c]
b = [e[1] for e in c]
print a
print b

出力を取得します:

[[1, 2], [7, 8], [3, 4], [5, 6], [9, 10]]
[2, 8, 4, 6, 10]

少し厄介だと思ってください。また、追加のリストも必要です。

4

7 に答える 7

51

質問で示されている関係を考えると、リストは同じ長さであり、すべての indexlist1[i]に対応すると仮定します。その前提が整っていれば、リストのシャッフルはインデックスのシャッフルと同じくらい簡単です。list2[i]i

 from random import shuffle
 # Given list1 and list2

 list1_shuf = []
 list2_shuf = []
 index_shuf = list(range(len(list1)))
 shuffle(index_shuf)
 for i in index_shuf:
     list1_shuf.append(list1[i])
     list2_shuf.append(list2[i])
于 2012-08-01T18:15:54.930 に答える
6

これを頻繁に行う必要がある場合は、インデックスのリストをシャッフルして、1 レベルの間接化を追加することを検討できます。

Python 2.6.6 (r266:84297, Aug 24 2010, 18:13:38) [MSC v.1500 64 bit (AMD64)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import random
>>> a = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
>>> b = [2, 4, 6, 8, 10]
>>> indexes = range(len(a))
>>> indexes
[0, 1, 2, 3, 4]
>>> random.shuffle(indexes)
>>> indexes
[4, 1, 2, 0, 3]
>>> for index in indexes:
...     print a[index], b[index]
...
[9, 10] 10
[3, 4] 4
[5, 6] 6
[1, 2] 2
[7, 8] 8
于 2012-08-01T18:16:48.600 に答える
2

numpy を使用した迅速な回答は、こちらを参照してください:
使用できます

p = numpy.random.permutation(len(a))

両方のリストのインデックスの新しいリストを作成し、それを使用して並べ替えます。

あなたのシナリオでは:

In [61]: a = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
In [62]: b = [2, 4, 6, 8, 10]
In [63]: import numpy as np
In [64]: a_ar, b_ar = np.array(a), np.array(b)
In [65]: p = np.random.permutation(len(a))
In [66]: a, b = a_ar[p].tolist(), b_ar[p].tolist()
In [68]: a
Out[68]: [[3, 4], [7, 8], [5, 6], [1, 2], [9, 10]]
In [69]: b
Out[69]: [4, 8, 6, 2, 10]
于 2016-09-18T10:02:17.280 に答える
-1

ここに何かが欠けているかどうかはわかりませんが、リストの1つをシャッフルしているだけで、もう1つは最初のリストの順序に合わせて再配置されているようです. したがって、あなたが持っているのは、これをより複雑にすることなくこれを行うための最良の方法です. 複雑なルートに進みたい場合は、1 つのリストをシャッフルし、シャッフルされていないリストを使用して、シャッフルされたリストを検索し、そのように並べ替えることができます。最終的には、最初と同じ結果になります。3 番目のリストの作成が問題になるのはなぜですか? リストを本当にリサイクルしたい場合は、リスト b をリスト c に使用しているものに置き換えて、後でそれを a と b に分離することができます。

于 2012-08-01T18:17:29.920 に答える