在 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,尽管这可以通过稍微麻烦的算法来解决(跟踪 b
和 d
的索引并抓取按索引而不是弹出的元素)。
如果我们先洗牌 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)
这是我的代码:
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,尽管这可以通过稍微麻烦的算法来解决(跟踪 b
和 d
的索引并抓取按索引而不是弹出的元素)。
如果我们先洗牌 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)