如何在python中更改glob模块的内部排序系统

2024-06-09 04:38:47 发布

您现在位置:Python中文网/ 问答频道 /正文

将regex应用于以'chr[0-9XY]'*开头的目录的名称文件后,我按以下顺序获得一个列表:

['chr9', 'chr8', 'chr7', 'chr6', 'chr5', 'chr4', 'chr3', 'chr2', 'chr1', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr18', 'chr19', 'chr20', 'chr21', 'chr22', 'chrX', 'chrY']

我申请了环球网模块来迭代目录中所需的文件,并按此方式排序。在

我的问题是,是否有可能使glob模块以不同的方式对文件进行排序,即按整数排序,最后是X和Y排序

['chr1', 'chr2', 'chr3', 'chr4', 'chr5', 'chr6', 'chr7', 'chr8', 'chr9', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr18', 'chr19', 'chr20', 'chr21', 'chr22', 'chrX', 'chrY']

有没有办法做到这一点?提前谢谢!在


Tags: 文件目录排序chr1chr5chr6chr2chr3
3条回答

您可以使用一个名为natsort的第三方库,它之所以这样称是因为它自然地对元素进行排序。

您可以通过pip install natsort安装它。您将需要pip,如果您还没有安装它,那么请查看here(如果您使用的是windows),否则,有不同的安装方法pip如果您的系统上尚未安装{},简单地做一个简单的搜索,您会找到合适的指南。

完成后,您可以轻松使用natsort为您完成所有工作:

>>> import natsort
>>> var = ['chr9', 'chr8', 'chr7', 'chr6', 'chr5', 'chr4', 'chr3', 'chr2', 'chr1', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr18', 'chr19', 'chr20', 'chr21', 'chr22', 'chrX', 'chrY']
>>> natsort.natsorted(var)
['chr1', 'chr2', 'chr3', 'chr4', 'chr5', 'chr6', 'chr7', 'chr8', 'chr9', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr18', 'chr19', 'chr20', 'chr21', 'chr22', 'chrX', 'chrY']

使用以下代码对blob进行排序:

blobs = ['chr9', 'chr8', 'chr7', 'chr6', 'chr5', 'chr4', 'chr3', 'chr2', 'chr1', 'chr10', 'chr11', 'chr12', 'chr13', 'chr14', 'chr15', 'chr16', 'chr17', 'chr18', 'chr19', 'chr20', 'chr21', 'chr22', 'chrX', 'chrY']

def blob_key(item):
    item_id = item.replace("chr", "")
    if item_id.isdigit():
        return int(item_id)
    return item_id

blobs.sort(key=blob_key)

print blobs

输出: ['chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10' ,'chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19 ','chr20','chr21','chr22','chrX','chrY']

blob_key函数接收一个项(在本例中是一个字符串)并返回与该项关联的键(如果该项是整数,则关联整数键,在另一种情况下:使用chr之后的字符串),然后使用该键进行排序,由于Python在排序时将整数放在字符串之前,因此输出就是我们想要的。

试试lambda

sorted(var, key=lambda var: int(var[3:]) if var[3:].isdigit() else var[3:])

相关问题 更多 >