отсортировать список, используя лямбда и регулярное выражение в python

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

Я хочу отсортировать списки в порядке, начиная с самой ранней даты. Как мне это сделать, используя лямбда и регулярное выражение?


person dratoms    schedule 14.11.2018    source источник
comment
Зачем тебе эти странные строки? Каков ожидаемый результат для данного списка?   -  person timgeb    schedule 14.11.2018
comment
извините, в исходной строке были символы '‹', которые мешали ее отображению. Я отредактировал вопрос, как вы можете видеть сейчас   -  person dratoms    schedule 14.11.2018
comment
Избегайте list в качестве имени переменной, уже есть встроенное list.   -  person timgeb    schedule 14.11.2018
comment
да список не должен был использоваться в качестве имени переменной. спасибо   -  person dratoms    schedule 14.11.2018


Ответы (3)


С кодом, который у вас есть, достаточно сделать:

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) 
person Duncan    schedule 14.11.2018
comment
спасибо за этот синтаксис. это было неуловимо для меня. и спасибо за эту аккуратную маленькую функцию. Хотя часть элемента списка генерируется автоматически и маловероятно, что будут пропущенные значения, ваша функция очень поможет мне в будущем, новичку в python (и программировании в целом), которым я являюсь. - person dratoms; 14.11.2018

Вы можете использовать dateutil.parser.parse (см. этот ответ: Разбирать строки даты?) для анализа даты и 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]))
person mrzasa    schedule 14.11.2018
comment
Я пока не использовал dateutil. Но выглядит многообещающе. Буду иметь это в виду. - person dratoms; 14.11.2018

Я думаю, что самым простым решением без импорта будет:

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']
person Nick    schedule 14.11.2018
comment
Последняя строка имеет дату с немного другим смещением. Я думаю, что намерение ОП состоит в том, что xxxx и yyyyy могут быть любыми произвольно длинными строками. - person Duncan; 14.11.2018
comment
точно. и перед шаблоном регулярного выражения могут быть другие номера строк, которые препятствуют естественной сортировке здесь. - person dratoms; 14.11.2018