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

2025-02-21 08:47:00
admin
原创
30
摘要:问题描述:我有一个包含版本字符串的列表,例如:versions_list = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"] 我想对其进行排序,因此结果将是这样的:...

问题描述:

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

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.3comes before2.2.32.2.2comes before 2.2.3

我如何用 Python 来实现这一点?


解决方案 1:

Python 3.10+

Stdlib distutils 已被弃用,并在 Python 3.12 中被完全删除(ref)。请参阅Tobias Leupold 的回答,了解当前 Python 版本中的最佳方法。

Python < 3.10

您还可以使用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

解决方案 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不再返回a list,所以我们需要将其包装在list调用中。

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

这里 map 的替代方法是列表推导式。有关列表推导式的更多信息,请参阅此文章。

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

解决方案 3:

natsort提出“自然排序”;其工作方式非常直观(在 Python 3 中)

from natsort import natsorted
versions = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"]
natsorted(versions)

给出

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

但它也适用于带有版本号的完整软件包名称:

versions = ['version-1.9', 'version-2.0', 'version-1.11', 'version-1.10']
natsorted(versions)

给出

['version-1.9', 'version-1.10', 'version-1.11', 'version-2.0']

解决方案 4:

使用packaging.version

from packaging.version import Version
versions = ['3.1', '0.7.1', '3.4.1', '0.7.7', '0.7.2', '3.3', '3.4.0', '0.7',
            '0.7.5', '0.7.6', '3.0', '3.3.1', '0.7.3', '3.2', '0.7.4']
versions.sort(key=Version)

结果:

['0.7', '0.7.1', '0.7.2', '0.7.3', '0.7.4', '0.7.5', '0.7.6',
 '0.7.7', '3.0', '3.1', '3.2', '3.3', '3.3.1', '3.4.0', '3.4.1']

解决方案 5:

我也使用 Python 解决了这个问题,虽然我的版本做了一些额外的事情,但这是我的代码:

def answer(l):
    list1 = [] # this is the list for the nested strings
    for x in l:
        list1.append(x.split("."))
    list2 = [] # this is the same list as list one except everything  is an integer in order for proper sorting
    for y in list1:
        y = list(map(int, y))
        list2.append(y)
    list3 = sorted(list2) #this is the sorted list of of list 2
    FinalList = [] # this is the list that converts everything back to the way it was
    for a in list3:
        a = '.'.join(str(z) for z in a)
        FinalList.append(a)
    return FinalList

对于版本,存在三个部分:主要版本、次要版本和修订版本。这样做的目的是,将版本组织起来,以便将版本'1'放在'1.0'版本之前'1.0.0'。此外,还有一个优点,如果您没有库,则无需导入任何库,并且它适用于旧版本的 Python,这个版本专门用于版本 2.7.6。无论如何,以下是一些示例:

Inputs:
    (string list) l = ["1.1.2", "1.0", "1.3.3", "1.0.12", "1.0.2"]
Output:
    (string list) ["1.0", "1.0.2", "1.0.12", "1.1.2", "1.3.3"]

Inputs:
    (string list) l = ["1.11", "2.0.0", "1.2", "2", "0.1", "1.2.1", "1.1.1", "2.0"]
Output:
    (string list) ["0.1", "1.1.1", "1.2", "1.2.1", "1.11", "2", "2.0", "2.0.0"]

如果您有任何疑问,请对答案进行评论!

解决方案 6:

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

# Sort using `key` where each version string is split into a tuple of integers

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

print(versions_list)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用