根据数字对字符串列表进行排序

时间:2018-09-19 19:57:29

标签: python

我有一个字符串列表

line = ["set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name','B10_Stat_TRXA_FCC'),'port', '1218');",
"set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name','Az_INS3_RawValidity'),'port', '1438');"]

我正在尝试根据最后一位数字1438和1218进行排序 数字排序..“ 1438”应视为数字

下面几行没有给我预期的结果

line = sorted(line)

["set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name','Az_INS3_RawValidity'),'port', '1438');",
 "set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name','B10_Stat_TRXA_FCC'),'port', '1218');"]

5 个答案:

答案 0 :(得分:2)

您可以使用正则表达式在sorted的关键参数中查找最后一个由单引号引起的数字:

import re

sorted(line,key=lambda x: int(re.findall("'(\d+)'", x)[-1]))

答案 1 :(得分:1)

您可以从最后一个逗号开始提取子字符串,然后从该字符串中提取数字。

sorted(line, key=lambda s: int(''.join(c for c in s.split(',')[-1] if c.isdigit())))

给予

["set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name','B10_Stat_TRXA_FCC'),'port', '1218');", 
"set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name','Az_INS3_RawValidity'),'port', '1438');"]

答案 2 :(得分:1)

假设您的数据保持该格式:

>>> sorted(line, key=lambda x: int(x.split()[-1][1:-3]))
["set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name','B10_Stat_TRXA_FCC'),'port', '1218');",
 "set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name','Az_INS3_RawValidity'),'port', '1438');"]

我取每一行,将其分割,然后取最后一项(例如,第一行为"'1218');")。然后,它通过切片符号剥离第一个字符(')和最后三个字符(');)。最后,它将文本值转换为整数,并将其用作排序的键。

正则表达式解决方案更通用。

sorted(line, key=lambda x: int(re.findall(r'(\d+)', x.split()[-1])[0]))

如果拆分中的最后一项不包含任何数字,则此操作将失败。

答案 3 :(得分:0)

使用python regex(https://docs.python.org/3.6/library/re.html)在字符串末尾提取整数值,然后可以创建一个函数,该函数将字符串作为参数,并返回整数。

最后,将lambda用作已排序方法的key参数以传递函数。 Python将使用您的函数作为排序的键。 (例如:Syntax behind sorted(key=lambda: ...)

答案 4 :(得分:0)

不如@Alexander响应,结果相同,但需要额外的步骤

new = sorted(line, key=lambda x: int((x.split()[-1]).split("'")[1]))
(xenial)vash@localhost:~/python/stack_overflow$ python3.7 list.py

["set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name'
,'B10_Stat_TRXA_FCC'),'port', '1218');", 
"set_param(find_system('Fccroot_to_ICD','RegExp','on','FindAll','on','Name',
'Az_INS3_RawValidity'),'port', '1438');"]