对以点分隔的数字列表进行排序,例如软件版本

新手上路,请多包涵

我有一个包含版本字符串的列表,例如:

 versions_list = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"]

我想对它进行排序,所以结果会是这样的:

 versions_list = ["1.0.0", "1.0.2", "1.0.12", "1.1.2", "1.3.3"]

数字的优先顺序显然应该是从左到右,而且应该是降序。因此 1.2.3 到之前 2.2.3 2.2.3 - 和 2.2.2

我如何在 Python 中执行此操作?

原文由 Zack 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 363
2 个回答

拆分每个版本字符串以将其作为整数列表进行比较:

 versions_list.sort(key=lambda s: map(int, s.split('.')))

为您的清单提供:

 ['1.0.0', '1.0.2', '1.0.12', '1.1.2', '1.3.3']

在 Python3 map 不再返回一个 list ,所以我们需要 将它包装在一个 list 调用 中。

 versions_list.sort(key=lambda s: list(map(int, s.split('.'))))

此处 map 的替代方法是 list comprehension 。有关列表理解的更多信息,请参阅 这篇文章

 versions_list.sort(key=lambda s: [int(u) for u in s.split('.')])

原文由 Eli Bendersky 发布,翻译遵循 CC BY-SA 3.0 许可协议

您还可以使用 distutils.version 标准库模块:

 from distutils.version import StrictVersion
versions = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"]
versions.sort(key=StrictVersion)

给你:

 ['1.0.0', '1.0.2', '1.0.12', '1.1.2', '1.3.3']

它还可以处理带有预发布标签的版本,例如:

 versions = ["1.1", "1.1b1", "1.1a1"]
versions.sort(key=StrictVersion)

给你:

 ["1.1a1", "1.1b1", "1.1"]

文档: https ://github.com/python/cpython/blob/3.2/Lib/distutils/version.py#L101

原文由 andreypopp 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题