如何在Python中对版本标签列表进行排序[重复]

Posted

技术标签:

【中文标题】如何在Python中对版本标签列表进行排序[重复]【英文标题】:How to sort list of version tags in Python [duplicate] 【发布时间】:2019-02-13 21:16:11 【问题描述】:

我有一个带有这样标签的列表:

list = ['1.0.0','1.0.1','1.1.1','1.1.1.abc','2.20.11','2.0.10.abc2']

我想根据第一个数字对其进行排序,然后是第二个数字,然后是第三个。

输出应该是这样的:

['1.0.0','1.0.1','1.1.1','1.1.1.abc','2.0.10.abc2','2.20.11']

我尝试过这样使用排序:

list.sort(key=lambda x: (x[:x.find('.')], int(x[x.find('.')+1:x.index('.',x.find('.')+1)]) ) )

我可以根据前两个数字进行排序,这是第三个数字困扰我,因为可能有字符串部分,并且数字可能是两位数或更多,我不知道如何排除最后一个字符串部分,只对数字进行排序。

对此有什么想法吗?

编辑

默认排序的问题在于,我不会正确地对所有部分进行排序,例如由于某种原因它会将 4.35.7 放在 4.9.2 之前,这就是为什么我需要根据每个部分显式排序的原因。我的问题是可能有一个字符串部分后跟数字。

【问题讨论】:

sorted(['1.0.0','1.0.1','1.1.1','1.1.1.abc','2.20.11','2.0.10.abc2']) 不会这样做吗?我得到了预期的结果.. 无论您需要何种自定义类型的排序,您的示例都不足以说明为什么默认的 sort/sorted 不起作用。 @Torxed 我刚刚列出了这个列表,但它会说 5.2.14 和 5.2.9,它会将 5.2.14 放在 5.2.9 之前 对不起,我的错误。不是上面的重复,是specific sort a list of numbers separated by dots的重复 pypi.org/project/natsort/3.3.0 【参考方案1】:

您可以将sortedkey 一起使用。

您确实需要使用str.split 将字符串拆分为标记。这将允许您依赖列表排序。

不过,您需要先将数字字符串转换为 int 才能获得预期结果,否则数字将按字母顺序而不是数字顺序排序。

示例

l = ['1.0.0','1.0.1','1.1.1','1.1.1.abc','2.20.11','2.0.10.abc2']
sorted_l = sorted(l, key=lambda x: [int(i) if i.isdigit() else i for i in x.split('.')])

输出

['1.0.0', '1.0.1', '1.1.1', '1.1.1.abc', '2.0.10.abc2', '2.20.11']

【讨论】:

我试过了,由于某种原因,它会将 4.35.7 放在 4.9.4 之前 @Anna 对不起,我只是忘了按点分割,应该是 x.split('.') 而不是 x.split()。这个现在有效 它仍在这样做,这就是我输入的内容: tags_sorted = sorted(tags,key = lambda x: [int(i) if i.isnumeric() else i for i in x.split ('.')]),但它将 4.9.4 放在 4.35.7 之前 嗯,4.9.4应该在4.35.7之前 对不起,又是我的错,我输出错了,它有效!!

以上是关于如何在Python中对版本标签列表进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中对列表进行排序[重复]

如何在 Flutter 中对列表进行排序 [重复]

如何在Java中对ArrayList进行排序[重复]

从最新到最旧的python对Mongo列表进行排序[重复]

如何在 Python 中对字典列表进行多重排序? [复制]

在Python中对关联数组进行排序[重复]