【问题标题】:How to sort a list of strings containing letters and numbers如何对包含字母和数字的字符串列表进行排序
【发布时间】:2022-11-23 06:14:28
【问题描述】:

我正在尝试对包含以特定格式编写的字符串的列表进行排序。

这是所述列表的示例:

numberList = ['Task #59;', 'Task #40.5; additional', 'Task #40.9; test', 'Task #40; Task Description Difference; test', 'Task #11;', 'Task #12;', 'Task #1;', 'Task #30.1;']

我目前正在使用下面这个我在网上找到并根据旧帖子修改的功能。

def natural_sort(listnum):

    convert = lambda text: int(text) if text.isdigit() else text.lower()
    alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
    listnum.sort(key=alphanum_key)
    
    return listnum

它按预期工作,期望它总是对 Task #40 进行排序;在任务#40.5 后面;和任务#40.9;。

['Task #1;', 'Task #11;', 'Task #12;', 'Task #30.1;', 'Task #40.5; additional', 'Task #40.9; test', 'Task #40; Task Description Difference; test', 'Task #59;']

但是,如果我完成任务 #40.0;它会正确排序。

['Task #1;', 'Task #11;', 'Task #12;', 'Task #30.1;', 'Task #40.0; Task Description Difference; test', 'Task #40.5; additional', 'Task #40.9; test', 'Task #59;']

有没有办法对任务 #40 进行排序?在任务#40.5 前面;和任务#40.5;而不必让它成为任务#40.0?

这是我获得代码表格的帖子的链接: Is there a built in function for string natural sort?

【问题讨论】:

  • 如果它们都是那种格式,最简单的事情就是在比较之前清除;。您不必修改实际的字符串,只需将 sort 与忽略最后位置的比较 lambda 一起使用即可。

标签: python sorting


【解决方案1】:

使用正则表达式提取数字部分并将其转换为浮点数以用作键

numberList = ['Task #59;', 'Task #40.5; additional', 'Task #40.9; test',
              'Task #40; Task Description Difference; test', 'Task #11;', 'Task #12;', 'Task #1;', 'Task #30.1;']

numberList = sorted(numberList, key=lambda v: float(re.search(r"Task #([d.]+);", v).group(1)))
print(numberList)


['Task #1;', 'Task #11;', 'Task #12;', 'Task #30.1;', 'Task #40; Task Description Difference; test', 'Task #40.5; additional', 'Task #40.9; test', 'Task #59;']

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2019-03-28
    • 2016-10-28
    • 2022-11-24
    • 2021-08-12
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多