我有一个简单的实验,有8个不同的试验,我希望只出现一次而不重复;参与者被要求解决'数字序列,其中4个序列具有溶液(S),4个不可溶解(U)。
因此,我有8个试验:
S1,S2,S3,S4,U1,U2,U3,U4。
我想提出试验,以便他们交替:
S1,U1,S2,U2,S3,U3,S4,U4
但是,我希望随机化S和U的顺序,同时保持交替模式。
例如,S3,U2,S2,U4,S4,U1,S1,U3
我正在使用构建器并且是Python的新手(尽管我熟悉Matlab中的编码)。我能想出的唯一解决方案是尝试在excel文件中对试验的顺序进行洗牌,然后将它们组合起来以便它们交替使用 - 但这看起来并不优雅。
是否有一种在构建器中实现此功能的简单方法或添加代码组件?
我已经包含了定义试验的输入文件/ excel表。专栏难度'表明它们是可解决的还是无法解决的试验。
欢呼声, 哈利
答案 0 :(得分:0)
使用先前的答案on list conversions和list comprehensions的概念
import random as r
a = ["s1","s2","s3","s4"]
b = ["u1","u2","u3","u4"]
r.shuffle(a)
r.shuffle(b)
trialList = [tr for pr in zip(a,b) for tr in pr]
答案 1 :(得分:0)
您应该zip
(或itertools.izip
),然后使用itertools.chain.from_iterable
展平结果。使用zip
获取多个序列并创建一个新序列,其中每个项目包含原始序列中的相应元素。在您的情况下,它将创建类似[(S3, U2), (S2, U4), (S4, U1), (S1, U3)]
的内容。然后,您可以使用chain
函数展平,以获得所需的[S3, U2, S2, U4, S4, U1, S1, U3]
序列。 shuffle
将两个序列就地的顺序随机化,而list
将chain
生成的迭代器转换为列表:
from itertools import chain, izip
from random import shuffle
solvable = [s1, s2, s3, s4]
unsolvable = [u1, u2, u3, u4]
shuffle(solvable)
shuffle(unsolvable)
trials = list(chain.from_iterable(izip(solvable, unsolvable)))