如何在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只是一个便利函数,它返回一个列表,但您不一定必须使用它

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...