如何用Python生成映射分组列表并集成到Snakemake工作流中?
实现思路与Snakemake代码
不用手动生成gpa/gpb这类重复分组列表,直接建立元素到所属分组的映射关系就能高效实现需求:
1. 定义分组与映射
在Snakefile开头先定义原始分组,并构建元素到对应分组的字典:
# 原始分组定义 gp1 = ["a", "b", "c"] gp2 = ["x", "y", "z"] all_elements = ["a", "b", "c", "x", "y", "z"] # 建立元素→所属分组的映射 element_to_group = {} for elem in gp1: element_to_group[elem] = gp1 for elem in gp2: element_to_group[elem] = gp2
2. 编写Snakemake规则
通过规则实现目录创建与文件复制逻辑:
# 总目标:触发所有元素的目录生成任务 rule all: input: expand("{elem}/", elem=all_elements) # 单元素目录创建+文件复制规则 rule setup_dir_and_copy: output: directory("{elem}/") params: # 根据通配符获取当前元素对应的分组文件列表 group_files=lambda wildcards: element_to_group[wildcards.elem] shell: """ mkdir -p {output} cp {" ".join(params.group_files)} {output} """
3. 逻辑说明
- 映射字典
element_to_group直接关联每个元素到它所属的原始分组,比如element_to_group["a"]对应["a","b","c"],element_to_group["x"]对应["x","y","z"],省去手动生成冗余列表的步骤。 rule all作为总入口,触发所有元素的目录创建任务。rule setup_dir_and_copy中,通过lambda函数根据通配符elem动态获取分组文件列表,再用" ".join()将列表转为空格分隔的文件名,执行复制操作。
运行Snakemake后,就能生成你需要的目标目录结构。
内容的提问来源于stack exchange,提问作者Dvik
相关产品推荐
相关产品推荐

