首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按照正确的顺序排列染色体列表

按照正确的顺序排列染色体列表
EN

Stack Overflow用户
提问于 2022-06-29 12:02:44
回答 4查看 119关注 0票数 4

一个看似简单的问题,但事实证明,这个问题有点令人烦恼。我有一份染色体清单(有23条染色体--第1至21号染色体,然后是X染色体和Y染色体)如下:

['chr11','chr14','chr16','chr13','chr4','chr13','chr2','chr1','chr2','chr3','chr14','chrX',]

我想按以下顺序对此进行排序:

['chr1', 'chr2','chr2','chr3','chr4','chr11','chr13','chr13', 'chr14','chr14','chr16','chrX']

然而,由于python的sort的词汇学性质,它将排序chr1, chr10, chr11, chr12...chr2,等,因为我有X染色体,按它们的整数值排序似乎也不是一种选择。我是否需要指定一个唯一的键来对列表进行排序?或者有什么明显的解决方案我错过了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-06-29 12:07:34

您可以使用natsorted,您想要的毕竟是自然排序;)

代码语言:javascript
运行
复制
l = ['chr11','chr14','chr16','chr13','chr4','chr13','chr2',
     'chr1','chr2','chr3','chr14','chrX','chrY']

from natsort import natsorted

out = natsorted(l)

产出:

代码语言:javascript
运行
复制
['chr1', 'chr2', 'chr2', 'chr3', 'chr4', 'chr11', 'chr13',
 'chr13', 'chr14', 'chr14', 'chr16', 'chrX', 'chrY']
票数 7
EN

Stack Overflow用户

发布于 2022-06-29 12:19:20

您可以创建一个自定义键:

代码语言:javascript
运行
复制
key={s:i for i,s in 
    enumerate([f'chr{x}' for x in list(range(1,22))+['X','Y']],1)}

>>> key
{'chr1': 1, 'chr2': 2, 'chr3': 3, 'chr4': 4, 'chr5': 5, 'chr6': 6, 'chr7': 7, 'chr8': 8, 'chr9': 9, 'chr10': 10, 'chr11': 11, 'chr12': 12, 'chr13': 13, 'chr14': 14, 'chr15': 15, 'chr16': 16, 'chr17': 17, 'chr18': 18, 'chr19': 19, 'chr20': 20, 'chr21': 21, 'chrX': 22, 'chrY': 23}

然后在sorted中使用该键作为查找

代码语言:javascript
运行
复制
li = ['chr11','chr14','chr16','chr13','chr4','chr13','chr2',
     'chr1','chr2','chr3','chr14','chrX','chrY']

>>> sorted(li, key=lambda s: key[s])
['chr1', 'chr2', 'chr2', 'chr3', 'chr4', 'chr11', 'chr13', 'chr13', 'chr14', 'chr14', 'chr16', 'chrX', 'chrY']

或者,您可以使用正则表达式进行自然排序,以解析出数字:

代码语言:javascript
运行
复制
import re

sli=sorted(li, key=lambda e: 
             [int(s) if s.isdigit() else s for s in re.findall(r'\d+|\D+', e)])

>>> sli
['chr1', 'chr2', 'chr2', 'chr3', 'chr4', 'chr11', 'chr13', 'chr13', 'chr14', 'chr14', 'chr16', 'chrX', 'chrY']

这个自定义键的速度要快得多--如果你有数十亿的数据要排序的话,就用它吧。

票数 0
EN

Stack Overflow用户

发布于 2022-06-29 12:20:34

正如@mozway已经提到的那样,nat排序是最快的方式。

这里的解决方案不需要使用外部库。

代码语言:javascript
运行
复制
sorted(l, key=lambda x: int(val) if (val:=x[3:]).isnumeric() else ord(val))

它给出了同样的输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72801110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档