微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Snakemake中使用扩展功能进行列表的排列或组合

如何解决如何在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所知,您不能给rexpand输出元组的长度)参数。做

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 举报,一经查实,本站将立刻删除。