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

时间:2019-02-13 21:16:12

标签: python versioning

我有一个带有以下标签的列表:

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之前,这就是为什么我需要基于每个部分显式排序。我的问题是,可能会有一个字符串部分,后跟数字。

1 个答案:

答案 0 :(得分:2)

您可以将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']