如何在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】:
您可以将sorted
与key
一起使用。
您确实需要使用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中对版本标签列表进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章