56

2つの簡単なリストがあるとしましょう。

a = ['Spears', "Adele", "NDubz", "Nicole", "Cristina"]
b = [1,2,3,4,5]
len(a) == len(b)

私がやりたいのは、ランダム化することですがab順序を維持します。だから、次のようなもの:

a = ["Adele", 'Spears', "Nicole", "Cristina", "NDubz"]
b = [2,1,4,5,3]

次を使用して1つのリストをシャッフルできることを認識しています。

import random
random.shuffle(a)

しかし、これは単にランダム化するだけですが、私はランダム化して、リストの「ランダム化された順序」を維持しaたいと思います。ab

これをどのように達成できるかについてのガイダンスをいただければ幸いです。

4

7 に答える 7

89

2つのリストを組み合わせて、結果のリストをシャッフルしてから分割します。これはを利用しますzip()

a = ["Spears", "Adele", "NDubz", "Nicole", "Cristina"]
b = [1, 2, 3, 4, 5]

combined = list(zip(a, b))
random.shuffle(combined)

a[:], b[:] = zip(*combined)
于 2012-11-12T12:04:00.197 に答える
19

zip「両方」の方法で機能する優れた機能を備えたものを使用してください。

import random

a = ['Spears', "Adele", "NDubz", "Nicole", "Cristina"]
b = [1,2,3,4,5]
z = zip(a, b)
# => [('Spears', 1), ('Adele', 2), ('NDubz', 3), ('Nicole', 4), ('Cristina', 5)]
random.shuffle(z)
a, b = zip(*z)
于 2012-11-12T12:04:09.670 に答える
18

車輪の再発明を回避するに は、sklearnを使用します

from sklearn.utils import shuffle

a, b = shuffle(a, b)
于 2018-05-14T12:13:43.883 に答える
10

Timの答えはPython2でのみ機能し、Python3では機能しないことに注意してください。Python3を使用する場合は、次のことを行う必要があります。

combined = list(zip(a, b))
random.shuffle(combined)
a[:], b[:] = zip(*combined)

そうしないと、エラーが発生します。

TypeError: object of type 'zip' has no len()
于 2015-05-18T02:46:55.447 に答える
3

ジッパー、コピー、およびそのすべての重いものを回避するより簡単な方法があります。両方を別々にシャッフルすることもできますが、両方の時間で同じシードを使用するため、シャッフルの順序が同じになることが保証されます。

import random as rd

A = list("abcde")
B = list(range(len(A)))
fixed_seed = rd.random()
rd.Random(fixed_seed).shuffle(A)
rd.Random(fixed_seed).shuffle(B)

AとBは次のようになります。

['e', 'a', 'c', 'b', 'd']
[ 4,   0,   2,   1,   3]

任意の数のリスト用のより一般的なバージョン:

def shuffle(*xss):
    seed = rd.random()
    for xs in xss:
        rd.Random(seed).shuffle(xs)
于 2019-11-14T10:17:42.303 に答える
2

別の方法は

a = ['Spears', "Adele", "NDubz", "Nicole", "Cristina"]
b = range(len(a)) # -> [0, 1, 2, 3, 4]
b_alternative = range(1, len(a) + 1) # -> [1, 2, 3, 4, 5]
random.shuffle(b)
a_shuffled = [a[i] for i in b] # or:
a_shuffled = [a[i - 1] for i in b_alternative]

これは逆のアプローチですが、それでも役立つ可能性があります。

于 2012-11-12T12:11:19.620 に答える
1

それが私のやり方だ:

import random
def shuffleTogether(A, B):
    if len(A) != len(B):
        raise Exception("Lengths don't match")
    indexes = range(len(A))
    random.shuffle(indexes)
    A_shuffled = [A[i] for i in indexes]    
    B_shuffled = [B[i] for i in indexes]
    return A_shuffled, B_shuffled

A = ['a', 'b', 'c', 'd']
B = ['1', '2', '3', '4']
A_shuffled, B_shuffled = shuffleTogether(A, B)
print A_shuffled
print B_shuffled
于 2018-01-27T16:36:55.643 に答える