Python如何按正确生物学顺序对染色体名称列表排序
Python实现染色体名称自然排序
自定义排序键是实现该需求最稳妥、无额外依赖的方案,完全可以匹配预期排序规则。
核心排序逻辑
- 1~21号常染色体按数字大小升序排列
- 性染色体按X、Y的顺序排在所有常染色体之后
默认字符串字典序排序出错的原因是逐字符比较时,chr11的第三个字符为1,会被判定小于第三个字符为2的chr2。自定义排序键的思路是为每个染色体名生成符合自然排序逻辑的可比较值,绕开字符串逐位比较的逻辑:
- 移除染色体名统一的
chr前缀 - 数字编号的常染色体直接转换为整数作为排序依据
- 为X、Y性染色体分配大于21的固定排序值,保证其排在常染色体队列末尾,且X顺序优先于Y
代码实现
# 输入列表 chr_list = ['chr11','chr14','chr16','chr13','chr4','chr13','chr2','chr1','chr2','chr3','chr14','chrX'] def chr_sort_key(name): tag = name.removeprefix('chr') if tag == 'X': return 22 if tag == 'Y': return 23 return int(tag) chr_list.sort(key=chr_sort_key) print(chr_list)
运行后输出与预期结果完全一致:
['chr1', 'chr2', 'chr2', 'chr3', 'chr4', 'chr11', 'chr13', 'chr13', 'chr14', 'chr14', 'chr16', 'chrX']
其他方案说明
部分生信场景会使用第三方自然排序库natsort实现类似需求,但该库默认排序规则会将字母开头的性染色体排在数字染色体之前,需要额外编写规则调整性染色体优先级,且会引入额外依赖,适用场景不如自定义排序键广泛。
内容的提问来源于stack exchange,提问作者KLM117
相关产品推荐
相关产品推荐

