洗牌两个相关列表的更好方法

新手上路,请多包涵

有没有更好的方法来随机洗牌两个相关列表而不破坏它们在另一个列表中的对应关系?我在 numpy.arrayc# 中找到了相关问题,但并不完全相同。

作为第一次尝试,一个简单的 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]

就是觉得有点别扭。它还需要一个额外的列表。

原文由 clwen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 381
2 个回答

鉴于问题中显示的关系,我将假设列表的长度相同,并且 list1[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])

原文由 kojiro 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果你愿意安装更多的包:

要求:NumPy (>= 1.6.1)、SciPy (>= 0.9)。

pip install -U scikit-learn

 from sklearn.utils import shuffle
list_1, list_2 = shuffle(list_1, list_2)

原文由 Tihomir Nedev 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题