【问题标题】:sort a list using lambda and regex in python在 python 中使用 lambda 和 regex 对列表进行排序
【发布时间】:2018-11-14 16:31:32
【问题描述】:
list = ['xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime', 'xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime', 'yyyyy' ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime]

datet = re.compile(r'ResultDatetime:(\d{4}-\d{2}-\d{2} \d{2}:\d{2})')

list.sort(key = lambda x: ........)

我想按从最早日期开始的顺序对列表进行排序。我应该如何使用 lambda 和正则表达式来处理它?

【问题讨论】:

  • 为什么会有这些奇怪的字符串?给定列表的预期输出是什么?
  • 很抱歉,原始字符串中包含“
  • 避免list作为变量名,已经有内置的list
  • yes list 不应该被用作变量名。谢谢

标签: python regex lambda


【解决方案1】:

使用您那里的代码就足够了:

list.sort(key=lambda x: datet.search(x).group(1))

(但请不要使用list 作为变量名)。

无需将提取的字符串转换为datetime,因为它已经采用了可以自然排序的格式。

但是请注意,如果任何字符串与正则表达式不匹配,这将产生错误,因此您最好将键拆分为命名的多行函数并在返回匹配组之前测试是否成功匹配。

def sort_key(line):                                                                                                                                               
    match = datet.search(line)                                                                                                                                               
    if match:                                                                                                                                                     
        return match.group(1)                                                                                                                                                    
    return ''        

data = [
    'xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime',
    'xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime',
    'yyyyy ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime'
]
data.sort(key=sort_key) 

【讨论】:

  • 感谢您的语法。这对我来说是难以捉摸的。并感谢那里的整洁的小功能。虽然列表元素部分是自动生成的,不太可能有缺失值,但你的函数将来会对我有很大帮助,我是 python(和一般编程)的新手。
【解决方案2】:

您可以使用dateutil.parser.parse(请参阅此答案:Parse date strings?)解析日期并使用re.findall 从字符串中获取日期

import re     
from dateutil.parser import parse

list = ['xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime', 'xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime', 'yyyyy ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime]
datet = re.compile(r'ResultDatetime:(\d{4}-\d{2}-\d{2} \d{2}:\d{2})')

list.sort(key = lambda x : parse(re.findall(datet, x)[0]))

【讨论】:

  • 我还没用过dateutil。但这似乎很有希望。会记住这一点。
【解决方案3】:

我认为没有任何导入的最简单的解决方案是:

data  = ['xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime',
         'xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime', 
         'yyyyy ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime']

sorted_data = sorted(data, key=lambda x: x[20:36])

print(sorted_data)

输出:

        ['xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime', 
         'xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime', 
         'yyyyy ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime']

【讨论】:

  • 最后一个字符串的日期偏移量略有不同。我认为 OP 的意图是 xxxx 和 yyyyy 可以是任意长的字符串。
  • 完全正确。并且在正则表达式模式之前可能还有其他字符串数字会阻碍这里的自然排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2010-10-17
  • 1970-01-01
  • 2020-11-11
相关资源
最近更新 更多