繁体   English   中英

特定排序由点分隔的数字列表

[英]Specific sort a list of numbers separated by dots

我有一个清单:

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)))

只需获取最后一部分,将其转换为 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 如何比较各种序列的更多信息

输出

['1.1.1.','1.1.2.','1.1.3.','1.1.4.','1.1.10.','1.1.11.','1.1.12.','1.1.13.']

如果需要按所有数字排序,请在 key 函数中生成整数序列:

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

使用https://pypi.org/project/natsort/3.3.0/或类似的库来比较软件版本。

如果你想用 Python 对 Semantic Versioning 标签进行排序:

不要自己实现! 相反,使用内置的打包库会带来更简洁、更健壮的解决方案:

from packaging.version import Version
versions = ['0.1.0-alpha', '0.1.0-alpha-2', '0.4.0', '0.3.1', '0.3.0', '0.2.0']
sorted_versions = sorted(versions, key=lambda elt: Version(elt))

此处查看有关语义版本控制的更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM