1

リストのリストを日付で並べ替える必要があります。

mylist=['ML-M01 Qual Report 07/31/13', 'ML36220010 Complete Qual Testing 07/24/13', 'ML36220045 Final FRB 07/13/13', 'ML9822D2600 Brief to PM 08/5/13']

このサイトから、次のコードを取得しました。

sorted(mylist, key=lambda x: datetime.datetime.strptime(x[2], '%m/%d/%y'))

ただし、次のエラー メッセージが表示されます。

sorted(mylist,key=lambda x: datetime.datetime.strptime(x[2], '%m/%d/%y'))
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    sorted(mylist,key=lambda x: datetime.datetime.strptime(x[2], '%m/%d/%y'))
  File "<pyshell#25>", line 1, in <lambda>
  sorted(mylist,key=lambda x: datetime.datetime.strptime(x[2], '%m/%d/%y'))
  File "C:\Python25\Lib\_strptime.py", line 330, in strptime
    (data_string, format))
ValueError: time data did not match format:  data=-  fmt=%m/%d/%y

ヘルプが必要 - リストを 3D 要素でソートする必要があります - 古いものから新しいものへ

4

2 に答える 2

8

リスト内の各エントリは、リストではなく文字列であるためx[2]、単一の文字 ('-'最初のエントリ) です。日付部分だけを次のように分割する必要がありますstrptime()

sorted(mylist, key=lambda x: datetime.datetime.strptime(x.rsplit(None, 1)[-1], '%m/%d/%y'))

効率のために、空白str.rsplit()一度に分割します。

>>> 'ML-M01 Qual Report 07/31/13'.rsplit(None, 1)
['ML-M01 Qual Report', '07/31/13']
>>> 'ML-M01 Qual Report 07/31/13'.rsplit(None, 1)[-1]
'07/31/13'

結果:

>>> sorted(mylist, key=lambda x: datetime.datetime.strptime(x.rsplit(None, 1)[-1], '%m/%d/%y'))
['ML36220045 Final FRB 07/13/13', 'ML36220010 Complete Qual Testing 07/24/13', 'ML-M01 Qual Report 07/31/13', 'ML9822D2600 Brief to PM 08/5/13']

新しいソートされたリストを返すことに注意してくださいsorted()。元のリストは影響を受けません。その場で並べ替えたい場合は、メソッドをmylist呼び出します。list.sort()

mylist.sort(key=lambda x: datetime.datetime.strptime(x.rsplit(None, 1)[-1], '%m/%d/%y'))
于 2013-06-18T12:47:21.880 に答える
2

あなたのエラー:

ValueError: time data did not match format:  data=-  fmt=%m/%d/%y

"-"日付ではないデータを取得したことを示します。これは、有効な日付を含まない行がリストに含まれていることを示しています。

このソリューションは、無効な日付を返すことで処理しますNone。これにより、すべての無効な日付がまとめられます。

import datetime

mylist=['ML-M01 Qual Report 07/31/13', 'ML36220010 Complete Qual Testing 07/24/13', 'ML36220045 Final FRB 07/13/13', 'ML9822D2600 Brief to PM 08/5/13']

def extract_date(text):
    try:
        return datetime.datetime.strptime(text.rsplit(None, 1)[-1], '%m/%d/%y')
    except ValueError:
        return None

mylist.sort(key=extract_date)

print mylist

出力:

['ML36220045 Final FRB 07/13/13', 
 'ML36220010 Complete Qual Testing 07/24/13', 
 'ML-M01 Qual Report 07/31/13', 
 'ML9822D2600 Brief to PM 08/5/13']
于 2013-06-18T12:49:51.660 に答える