这是我的代码:
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']
答案 0 :(得分:3)
如果我们首先对c
和d
进行随机播放,则从连续列表ac
和bd
中随机抽样会得到所需的结果(我使用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)
答案 1 :(得分:1)
这是一种方法:
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洗牌更方便,然后再将它复制一份。然后,为了制作新的列表x和y,我首先通过改组a + c
来制作x,然后通过x
并添加b
或{{1}的成员来构建y取决于d
的相应元素是x
还是a
。
这种方法假设a和b中的元素集与c和d中的元素不相交。当前版本也会在制作c
的过程中销毁b和d,尽管这可以通过稍微麻烦的算法来解决(将索引跟踪到y
和b
并抓住按索引而不是弹出的元素。)
答案 2 :(得分:0)
首先随机改组c然后压缩到?
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')]
当列表c随机混洗时,列表a的顺序不会改变。 希望它有所帮助。