在 Python 中分别洗牌两个列表

Shuffling two lists separately in Python

这是我的代码:

import random
from random import shuffle

a = ['a','b','c','d']
b = ['a','b','c','d']
c = ['w','x','y','z']
d = ['w','x','y','z']
indices = random.sample(range(len(a)), len(a))
a = map(a.__getitem__, indices)
b = map(b.__getitem__, indices)
shuffle(c)
shuffle(d)
print a,b,c,d

这段代码的作用是按相同的顺序打乱 a 和 b,并按自己的顺序打乱 c 和 d。我现在要做的是制作两个更长的列表,分别由 a 和 c、b 和 d 组成,并将它们随机排列。我想要的是 a 和 b 在列表中保持相同的顺序。有什么办法吗?任何帮助将不胜感激。 :)

编辑:

我希望输出看起来像这样,其中列表 a&b 对应,c&d 只是独立随机化。

['d','x','w','b','a','y','c','z']

['d','z','y','b','a','x','c','w']

先随机洗牌 c 然后压缩到 a 怎么样?

    import random
    a=['a','b','c','d']
    b=['a','b','c','d']
    c=['w','x','y','z']
    d=['w','x','y','z']
    random.shuffle(c)
    a_c = zip(a,c)
    print a_c

[('a', 'y'), ('b', 'z'), ('c', 'x'), ('d', 'w')]

列表a的顺序不变,列表c随机打乱。 希望对你有帮助。

这是一种方法:

a = ['a','b','c','d']
# make b later
c = ['w','x','y','z']
d = ['w','x','y','z']
random.shuffle(a)
random.shuffle(c)
random.shuffle(d)
b = list(a)

x = a + c
random.shuffle(x)

y = []
for item in x:
    if item in a:
        y.append(b.pop())
    else:
        y.append(d.pop())

>>> x
['w', 'z', 'b', 'x', 'c', 'd', 'a', 'y']
>>> y
['z', 'y', 'b', 'x', 'c', 'd', 'a', 'w']

如果你想让a和b有相同的随机顺序,直接打乱a,然后让b复制它会更方便。然后为了制作新列表 x 和 y,我首先通过洗牌 a + c 来制作 x,然后通过 x 并添加来自 b 或 [=14= 的成员来构建 y ]取决于x对应的元素是在a还是c.

此方法假设 a 和 b 中的元素集与 c 和 d 中的元素集不相交。当前版本还在制作 y 的过程中破坏了 b 和 d,尽管这可以通过稍微麻烦的算法来解决(跟踪 bd 的索引并抓取按索引而不是弹出的元素)。

如果我们先洗牌 cd,从连接列表 acbd 中随机抽样给出所需的结果(我使用 Python 3 所以打印需要括号):

import random
from random import shuffle

a = ['a','b','c','d']
b = ['a','b','c','d']
c = ['w','x','y','z']
d = ['w','x','y','z']
shuffle(c)
shuffle(d)
# print a,b,c,d
print (a,b,c,d)
ac = a + c
bd = b + d
indices = random.sample(range(len(ac)),len(ac))
ac = list(map(ac.__getitem__, indices))
bd = list(map(bd.__getitem__, indices))
#print ac, bd
print (ac, bd)

输出如下:

['a', 'b', 'c', 'd'] ['a', 'b', 'c', 'd'] ['x', 'w', 'z', 'y']['y', 'z', 'w', 'x']
['y', 'z', 'c', 'x', 'b', 'w', 'd', 'a'] ['x', 'w', 'c', 'y', 'b', 'z', 'd', 'a']

编辑:

感谢@Jan-Philip Gehrcke,他指出当列表很大时使用 numpy 索引(如下所示)要快得多:

from random import shuffle
import numpy as np

a = ['a','b','c','d']
b = a[:]
c = ['w','x','y','z']
d = c[:]
shuffle(c)
shuffle(d)
# print a,b,c,d
print (a,b,c,d)
ac = np.array(a + c)
bd = np.array(b + d)
indices = list(range(len(ac)))
shuffle(indices)
ac = ac[indices]
bd = bd[indices]
#print ac, bd
print (ac, bd)