2

時間文字列に基づいて、このような多次元リストを並べ替えるにはどうすればよいですか? サブリストは異なるサイズにすることができます (つまり、ここでは 4 と 5)。

各サブリストの初回文字列を比較してソートしたい(サブリスト[-4])

x =  
(['1513', '08:19PM', '10:21PM', 1, 4],
['1290', '09:45PM', '11:43PM', 1, 4],
['0690', '07:25AM', '09:19AM', 1, 4],
['0201', '08:50AM', '10:50AM', 1, 4],
['1166', '04:35PM', '06:36PM', 1, 4],
['0845', '05:40PM', '07:44PM', 1, 4],
['1267', '07:05PM', '09:07PM', 1, 4],
['1513', '08:19PM', '10:21PM', 1, 4],
['1290', '09:45PM', '11:43PM', 1, 4],
['8772', '0159', '12:33PM', '02:43PM', 1, 5],
['0888', '0570', '09:42PM', '12:20AM', 1, 5],
['2086', '2231', '04:10PM', '06:20PM', 1, 5])

ソートされた結果は次のようになります

sortedX = 
    (['0690', '07:25AM', '09:19AM', 1, 4],
    ['0201', '08:50AM', '10:50AM', 1, 4],
    ['1166', '04:35PM', '06:36PM', 1, 4],
    ['0845', '05:40PM', '07:44PM', 1, 4],
    ['1267', '07:05PM', '09:07PM', 1, 4],
    ['1513', '08:19PM', '10:21PM', 1, 4],
    ['1513', '08:19PM', '10:21PM', 1, 4],
    ['1290', '09:45PM', '11:43PM', 1, 4],
    ['1290', '09:45PM', '11:43PM', 1, 4],
    ['8772', '0159', '12:33PM', '02:43PM', 1, 5], 
    ['2086', '2231', '04:10PM', '06:20PM', 1, 5],
    ['0888', '0570', '09:42PM', '12:20AM', 1, 5])

私は次のことを試しました:

sortedX = sorted(x, key=lambda k : k[-4])   #k[-4] is the first time string

それは機能しますが、サブリストのサイズの順序を尊重しません

4

2 に答える 2

3

文字列は辞書式に比較されるため、文字列による時間を比較するとバグが発生する可能性があります。

>>> '02:00PM' > '12:00PM'
False
>>> '2' > '100'
True

time.strptimeそのため、最初にこれらの時間文字列を時間オブジェクトに変換するために使用します。

>>> import time
>>> import pprint
def func(x):
    return (len(x), time.strptime(x[-4], '%I:%M%p'))
... 
>>> pprint.pprint(sorted(x, key=func))
[['0690', '07:25AM', '09:19AM', 1, 4],
 ['0201', '08:50AM', '10:50AM', 1, 4],
 ['1166', '04:35PM', '06:36PM', 1, 4],
 ['0845', '05:40PM', '07:44PM', 1, 4],
 ['1267', '07:05PM', '09:07PM', 1, 4],
 ['1513', '08:19PM', '10:21PM', 1, 4],
 ['1513', '08:19PM', '10:21PM', 1, 4],
 ['1290', '09:45PM', '11:43PM', 1, 4],
 ['1290', '09:45PM', '11:43PM', 1, 4],
 ['8772', '0159', '12:33PM', '02:43PM', 1, 5],
 ['2086', '2231', '04:10PM', '06:20PM', 1, 5],
 ['0888', '0570', '09:42PM', '12:20AM', 1, 5]]

複数の値で並べ替えるには、タプルを使用します。この場合、最初の項目は長さと時間のオブジェクトであり、2 番目の項目です。

于 2013-11-08T21:57:04.760 に答える