随机化两个列表并保持 Python 中的顺序



>假设我有两个简单的列表,

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]

我知道我可以使用以下方法洗牌一个列表:

import random
random.shuffle(a)

但这只是随机化a,而我想随机化a,并保持列表b中的"随机顺序"。

希望就如何实现这一目标提供任何指导。

我将两个列表组合在一起,打乱结果列表,然后拆分它们。这利用了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)

使用具有"两种"方式工作的好功能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)

为了避免重新发明轮子,请使用sklearn

from sklearn.utils import shuffle
a, b = shuffle(a, b)

请注意,Tim 的答案仅适用于 Python 2,不适用于 Python 3。如果使用 Python 3,你需要做:

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

否则,您会收到错误:

TypeError: object of type 'zip' has no len()

有一种更简单的方法可以避免压缩、复制和所有这些繁重的东西。我们可以分别洗牌它们,但两次都使用相同的种子,这保证了洗牌的顺序是相同的。

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)

另一种方式可能是

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]

这是相反的方法,但仍然可以帮助您。

这是我的方式:

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

最新更新