【问题标题】:Sort list of string in PythonPython中的字符串排序列表
【发布时间】:2021-07-10 09:25:49
【问题描述】:

我需要您的帮助才能正确排序以下字符串列表。

我有下一个字符串列表:

listElements = ['2018_1', '2018_10', '2018_2', '2018_3', '2019_1', '2019_10', '2019_2, '2019_3', '2020_1', '2020_10', '2020_2', '2020_3']

这就是我需要的结果:

listElements = ['2018_1', '2018_2', '2018_3', '2018_10', '2019_1', '2019_2, '2019_3', '2019_10', '2020_1', 2020_2', '2020_3', 2020_10']

提前致谢!

【问题讨论】:

  • 你想研究自然排序,这里有一个类似的问题:stackoverflow.com/questions/4836710/…
  • 谢谢彼得,它成功了!
  • 可以简单使用:sorted(listElements, key = lambda v: [int(i) for i in v.split('_')]),
  • 或:sorted(listElements, key=lambda x: list(map(int, x.split('_'))))

标签: python string list sorting


【解决方案1】:

您必须使用 sort() 和自定义比较功能。该函数比较字符串的第一部分(_之前),如果相同,则比较字符串的第二部分。

def comp(item1, item2):
    i1 = [int(i) for i in item1.split('_')]
    i2 = [int(i) for i in item2.split('_')]
    if i1[0] < i2[0]:
        return -1
    if i1[0] > i2[0]:
        return 1
    if i1[1] < i2[1]:
        return -1
    if i1[1] > i2[1]:
        return 1
    return 0

这里是驱动代码:

import functools

listElements = ['2018_1', '2018_10', '2018_2', '2018_3', '2019_1', '2019_10', '2019_2', '2019_3', '2020_1', '2020_10', '2020_2', '2020_3']

def comp(item1, item2):
    i1 = [int(i) for i in item1.split('_')]
    i2 = [int(i) for i in item2.split('_')]
    if i1[0] < i2[0]:
        return -1
    if i1[0] > i2[0]:
        return 1
    if i1[1] < i2[1]:
        return -1
    if i1[1] > i2[1]:
        return 1
    return 0
    
listElements.sort(key=functools.cmp_to_key(comp))
print(listElements)
# ['2018_1', '2018_2', '2018_3', '2018_10', '2019_1', '2019_2, '2019_3', '2019_10', '2020_1', 2020_2, '2020_3', 2020_10']

【讨论】:

    【解决方案2】:

    解决了。

    从 natsort 导入 natsorted,ns

    natsorted(listElements, alg=ns.IGNORECASE)

    【讨论】:

    • 在这种情况下,自然排序似乎有点过头了,因为使用简单键的常规排序可以工作(即参见我的评论)。
    【解决方案3】:

    使用自定义比较函数通常是解决此类排序问题的“pythonic”方法。

    另一种方法是将列表转换为可以本地排序的临时列表,然后将结果转换回所需的格式(不必是原始格式)。

    例如,以下将做你想做的事:

    tmpList = [[int(n) for n in e.split("_")] for e in istElements]
    tmpList.sort()
    istElements = ["%d_%d" % tuple(p) for p in tmpList]
    

    如果您愿意,您可以使用嵌套列表推导式或生成器在单个语句中完成所有这些操作,因此您不需要临时列表:

    istElements = [
        "%d_%d" % tuple(p)
        for p in sorted(
            [
                int(n)
                for n in e.split("_")
            ]
            for e in istElements
        )
    ]
    

    我尝试将语句格式化为多行,以便列表推导的结构变得清晰。

    【讨论】:

      【解决方案4】:

      代码

      sorted(listElements, key = lambda v: [int(i) for i in v.split('_')])
      

      结果

      ['2018_1', '2018_2', '2018_3', '2018_10', '2019_1', '2019_2', '2019_3', '2019_10', '2020_1', '2020_2', '2020_3', '2020_10']
      

      说明

      Key 函数将每个字符串转换为整数列表,Python 列表比较函数知道如何在排序期间进行比较。

      【讨论】:

        猜你喜欢
        • 2014-10-04
        • 1970-01-01
        • 2016-05-28
        • 2020-04-30
        • 2022-11-10
        • 2020-07-17
        • 1970-01-01
        • 2017-05-15
        • 2016-01-29
        相关资源
        最近更新 更多