说我有两个简单的清单,
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)
Nim*_*rag 13
为了避免重新发明轮子 使用sklearn
from sklearn.utils import shuffle
a, b = shuffle(a, b)
Run Code Online (Sandbox Code Playgroud)
请注意,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)