【问题标题】:Specific sort a list of numbers separated by dots具体排序由点分隔的数字列表
【发布时间】:2014-01-26 09:03:34
【问题描述】:

我有一个清单:

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

【问题讨论】:

  • 你的问题与 Django 无关,真的。
  • 当列表中有1.2.1 值时会发生什么?如果有2.1.1 会发生什么?排序是否应该将所有这些都考虑在内?

标签: python list sorting


【解决方案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 如何比较各种序列的更多信息,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.']

【讨论】:

    【解决方案2】:

    如果需要按所有位排序,在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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        不要不要自己实现这个!相反,使用内置的 packaging 库会导致更清洁和更健壮的解决方案:

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

        查看语义版本控制的更多详细信息here

        【讨论】:

          猜你喜欢
          • 2015-09-14
          • 2013-02-24
          • 2014-03-19
          • 2018-11-14
          • 2021-12-21
          • 1970-01-01
          • 2021-07-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多