如何在Snakemake中遍历嵌套列表元素以规范输出命名?
解决Snakemake中RUN与对应索引样本的路径配对问题
直接用列表推导式+expand就能搞定,不需要拆分SAMPLES列表,完美对应索引配对,同时生成单个样本的路径:
RUN_ID = ["run1", "run2"] SAMPLES = [["A", "B", "C"], ["D","E","F"]] # 生成目标路径列表 output_paths = [ path for run, samples_sub in zip(RUN_ID, SAMPLES) for path in expand("results/{run}/{sample}.txt", run=run, sample=samples_sub) ]
原理说明
zip(RUN_ID, SAMPLES)严格保证run1对应["A","B","C"],run2对应["D","E","F"],不会乱配对;- 内层的
expand会把每个子列表里的样本单独展开,生成results/run1/A.txt、results/run1/B.txt这类单个样本的路径,而非把整个子列表塞进去; - 列表推导式把所有路径整合到一个列表里,直接可以用在
rule all的input或者其他规则的output里。
如果要直接写在规则里,也可以这么用:
rule all: input: [ path for run, samples_sub in zip(RUN_ID, SAMPLES) for path in expand("results/{run}/{sample}.txt", run=run, sample=samples_sub) ]
这种方式完全自动化,不用手动拆分SAMPLES,也不会出现错误配对的问题。
内容的提问来源于stack exchange,提问作者recurso
相关产品推荐
相关产品推荐

