urutkan daftar menggunakan lambda dan regex dengan 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: ........)

Saya ingin mengurutkan daftar dalam urutan dimulai dengan tanggal paling awal. Bagaimana cara saya melakukannya menggunakan lambda dan regex?


person dratoms    schedule 14.11.2018    source sumber
comment
Mengapa Anda memiliki string yang aneh ini? Apa keluaran yang diharapkan dari daftar yang diberikan?   -  person timgeb    schedule 14.11.2018
comment
maaf string asli memiliki karakter '‹' di dalamnya yang mengganggu tampilannya. Saya telah mengedit pertanyaan seperti yang Anda lihat sekarang   -  person dratoms    schedule 14.11.2018
comment
Hindari list sebagai nama variabel, sudah ada list bawaan.   -  person timgeb    schedule 14.11.2018
comment
ya daftar seharusnya tidak digunakan sebagai nama variabel. terima kasih   -  person dratoms    schedule 14.11.2018


Jawaban (3)


Dengan kode yang Anda miliki di sana, cukup melakukan:

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

(tapi tolong, jangan gunakan list sebagai nama variabel).

Tidak perlu mengonversi string yang diekstraksi menjadi datetime karena sudah dalam format yang dapat diurutkan secara alami.

Namun perhatikan bahwa jika ada string yang tidak cocok dengan regex, ini akan menghasilkan kesalahan, jadi sebaiknya Anda membagi kunci menjadi fungsi multi-baris bernama dan menguji kecocokan yang berhasil sebelum mengembalikan grup yang cocok.

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
terima kasih untuk sintaksis itu. itu sulit dipahami olehku. dan terima kasih atas acara kecil yang rapi di sana. Meskipun bagian elemen daftar dibuat secara otomatis dan kecil kemungkinannya akan ada nilai yang hilang, fungsi Anda akan banyak membantu saya di masa depan, saya adalah seorang pemula dalam python (dan pemrograman secara umum). - person dratoms; 14.11.2018

Anda dapat menggunakan dateutil.parser.parse (lihat jawaban ini: Parsing string tanggal?) untuk mengurai tanggal dan re.findall untuk mendapatkannya dari sebuah string

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
Saya belum pernah menggunakan dateutil sejauh ini. Tapi tampaknya menjanjikan. Akan mengingat hal ini. - person dratoms; 14.11.2018

Saya pikir solusi paling sederhana tanpa impor apa pun adalah:

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)

Keluaran:

        ['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
String terakhir memiliki tanggal dengan offset yang sedikit berbeda. Saya pikir maksud OP adalah bahwa xxxx dan yyyyy bisa berupa string yang panjangnya sewenang-wenang. - person Duncan; 14.11.2018
comment
tepat. dan mungkin ada nomor string lain sebelum pola regex yang akan menghambat penyortiran alami di sini. - person dratoms; 14.11.2018