随机化两个列表并在python中维护顺序

Joh*_*hnJ 52 python

说我有两个简单的清单,

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

我想做的是随机化a,b但维持秩序.所以,像:

a = ["Adele", 'Spears', "Nicole", "Cristina", "NDubz"]
b = [2,1,4,5,3]
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用以下方式对一个列表进行洗牌:

import random
random.shuffle(a)
Run Code Online (Sandbox Code Playgroud)

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

希望得到关于如何实现这一目标的任何指导.

Tim*_*Tim 86

我将两个列表组合在一起,对结果列表进行洗牌,然后拆分它们.这利用了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)
Run Code Online (Sandbox Code Playgroud)


小智 16

使用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)
Run Code Online (Sandbox Code Playgroud)

  • 晚了九秒!该死的 :) (3认同)

Nim*_*rag 13

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

from sklearn.utils import shuffle

a, b = shuffle(a, b)
Run Code Online (Sandbox Code Playgroud)


Ada*_*m_G 9

请注意,Tim的答案仅适用于Python 2,而不适用于Python 3.如果使用Python 3,则需要执行以下操作:

combined = list(zip(a, b))
random.shuffle(combined)
a[:], b[:] = zip(*combined)
Run Code Online (Sandbox Code Playgroud)

否则你会收到错误:

TypeError: object of type 'zip' has no len()
Run Code Online (Sandbox Code Playgroud)