我有一个清单:
L = ['1.1.1.', '1.1.10.', '1.1.11.', '1.1.12.', '1.1.13.', '1.1.2.', '1.1.3.', '1.1.4.']
我想按下一个顺序对其进行排序:
1.1.1.
1.1.2.
1.1.3.
1.1.4.
1.1.10.
1.1.11.
1.1.12.
1.1.13.
以下方法不会产生结果:
L.sort(key=lambda s: int(re.search(r'.(\d+)',s).group(1)))
答案 0 :(得分:9)
只需获取最后一部分,将其转换为int并将其作为比较密钥返回
print(sorted(L, key=lambda x: int(x.split(".")[2])))
如果您想要考虑所有部分,您可以这样做
print(sorted(L, key=lambda x: [int(i) for i in x.rstrip(".").split(".")]))
它删除字符串末尾的.
,根据.
拆分它们,然后将其的每个部分转换为int
。返回的列表将用于比较。
您可以阅读有关Python如何比较各种序列的更多信息,here
<强>输出强>
['1.1.1.','1.1.2.','1.1.3.','1.1.4.','1.1.10.','1.1.11.','1.1.12.','1.1.13.']
答案 1 :(得分:5)
如果您需要按所有数字排序,请在键功能中生成一系列整数:
sorted(L, key=lambda v: [int(p) for p in v.split('.') if p.isdigit()])
这种方法在点之间的非数字值方面很稳健。
演示:
>>> L = ['1.1.1.', '1.1.10.', '1.1.11.', '1.1.12.', '1.1.13.', '1.1.2.', '1.1.3.', '1.1.4.']
>>> sorted(L, key=lambda v: [int(p) for p in v.split('.') if p.isdigit()])
['1.1.1.', '1.1.2.', '1.1.3.', '1.1.4.', '1.1.10.', '1.1.11.', '1.1.12.', '1.1.13.']
您的特定尝试仅返回列表中的第二个数字,对于您的示例数据总是 1
。
答案 2 :(得分:0)
使用https://pypi.org/project/natsort/3.3.0/或类似的库来比较软件版本。
答案 3 :(得分:0)