如何解决如何在Snakemake中使用扩展功能进行列表的排列或组合
在Snakemake中可能是一个非常基本的问题,但到目前为止我找不到答案。说我有样品清单
SAMPLES = ["A","B","C"]
典型的expand
命令如下所示:
expand("{sample}.txt",sample=SAMPLES)
但是我想获得相同样本列表的组合(甚至排列)。
正在做
expand("{sample}-{sample}.txt",sample=SAMPLES)
会给你
A-A.txt,A-B.txt,A-C.txt,B-A.txt,B-B.txt,B-C.txt,C-A.txt,C-B.txt,C-C.txt
我想要的是:
A-B.txt,B-C.txt
在expand function的Snakemake文档中,他们说:
“默认情况下,expand使用python itertools函数product
,该函数产生提供的通配符值的所有组合。但是,通过插入第二个位置参数,可以用任何组合函数代替,例如zip
“
但是,我不能仅将product
替换为itertools.combinations函数,因为据我从source code of expand所知,您不能给r
( expand
的输出元组的长度)参数。做
import itertools
expand("{sample}-{sample}.txt",itertools.combinations,sample=SAMPLES)
返回错误'list' object cannot be interpreted as an integer
。但是它可以与itertools.product
一起使用。
我想我可以在调用expand之前用itertools.combinations
在规则之外创建两个列表,但是我希望从Snakemake社区中找到一种优雅的方式。
谢谢!
解决方法
也许可以在expand
内完成,但我认为如果没有它,生成感兴趣的列表会更容易。例如:
SAMPLES = ["A","B","C"]
combs = []
for x in itertools.combinations(SAMPLES,2):
combs.append('%s-%s.txt' %(x[0],x[1]))
print(combs)
['A-B.txt','A-C.txt','B-C.txt']
现在无论您在使用combs
的地方使用expand(...)
。考虑到expand
只是一个便利函数,它返回一个列表,但您不一定必须使用它
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。