我有一个带有以下标签的列表:
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之前,这就是为什么我需要基于每个部分显式排序。我的问题是,可能会有一个字符串部分,后跟数字。
答案 0 :(得分:2)
您可以将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']