จัดเรียงรายการโดยใช้ lambda และ regex ใน 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: ........)

ฉันต้องการเรียงลำดับรายการโดยเริ่มจากวันแรกสุด ฉันควรทำอย่างไรโดยใช้ lambda และ regex


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 เนื่องจากอยู่ในรูปแบบที่จะเรียงลำดับตามธรรมชาติอยู่แล้ว

อย่างไรก็ตาม โปรดทราบว่าหากสตริงใดๆ ไม่ตรงกับ regex จะทำให้เกิดข้อผิดพลาด ดังนั้นคุณควรแยกคีย์ออกเป็นฟังก์ชันหลายบรรทัดที่มีชื่อและทดสอบการจับคู่ที่ประสบความสำเร็จก่อนส่งคืนกลุ่มที่ตรงกัน

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
ขอบคุณสำหรับไวยากรณ์นั้น นั่นเป็นเรื่องยากสำหรับฉัน และขอขอบคุณสำหรับฟังก์ชันเล็กๆ น้อยๆ ที่เรียบร้อยที่นั่น แม้ว่าส่วนของ list element จะถูกสร้างอัตโนมัติและไม่น่าจะมีค่าหายไป แต่ฟังก์ชันของคุณจะช่วยฉันได้มากในอนาคต มือใหม่หัดใช้ 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
สตริงสุดท้ายมีวันที่ต่างกันเล็กน้อย ฉันคิดว่าความตั้งใจของ OP คือ xxxx และ yyyyy อาจเป็นสตริงที่ยาวโดยพลการ - person Duncan; 14.11.2018
comment
อย่างแน่นอน. และอาจมีหมายเลขสตริงอื่นๆ ก่อนรูปแบบ regex ที่จะขัดขวางการเรียงลำดับตามธรรมชาติที่นี่ - person dratoms; 14.11.2018