私はリストソート関数(例えば、 date_list.sort(cmp = dcmp)
の日付比較を行う以下のPythonコードを持っています。それをオンライナーにする。
def dcmp(a, b):
amm, add, ayy = [int(v) for v in a.split('/')]
bmm, bdd, byy = [int(v) for v in b.split('/')]
v = cmp(ayy, byy)
if v != 0: return v
v = cmp(amm, bmm)
if v != 0: return v
return cmp(add, bdd)
更新:私が興味をそそられていることを明確にしましょう。関数からこのコードブロックを削除できますか?
v = cmp(ayy, byy)
if v != 0: return v
v = cmp(amm, bmm)
if v != 0: return v
return cmp(add, bdd)
あなたの月と日のすべてがゼロ詰めであり、あなたの日付が "01/01/2001"のようなm/d/Yフォーマットであれば、次のように書くことができます:
def datekey(d):
m, d, y = d.split('/')
return (y, m, d)
datelist.sort(key=datekey)
数値が常にゼロで埋められない場合は、比較のために各数値をintにキャストできます。
def datekey(d):
m, d, y = d.split('/')
return (int(y), int(m), int(d))
datelist.sort(key=datekey)
すべての日付が単純な形式である場合は、 strptime
を使用するよりも、これは way
>>> import timeit
>>> print timeit.Timer("datelist.sort(key=datekey)",
... setup="""\
... datelist = ['01/01/2001', '01/02/2001', '12/31/1999']
... def datekey(d):
... m, d, y = d.split('/')
... return (y, m, d)
... """).timeit()
3.3154168129
>>> print timeit.Timer("datelist.sort(key=datekey)",
... setup="""\
... datelist = ['01/01/2001', '01/02/2001', '12/31/1999']
... def datekey(d):
... m, d, y = d.split('/')
... return (int(y), int(m), int(d))
... """).timeit()
11.1701700687
>>> print timeit.Timer("datelist.sort(key = lambda s: datetime.datetime.strptime(s, '%m/%d/%Y'))",
... setup="""\
... datelist = ['01/01/2001', '01/02/2001', '12/31/1999']
... import datetime
... """).timeit()
59.2817358971
strptime
is hugely powerful, very important to know, and very slow in this use case.
私が探していたのは、このコードだけを置き換えることでした(日付は無視されます)
v = cmp(ayy, byy)
if v != 0: return v
v = cmp(amm, bmm)
if v != 0: return v
return cmp(add, bdd)
正解は次のとおりです。
return cmp(ayy, byy) or cmp(amm, bmm) or cmp(add, bdd)
これは、次のように書くこともできます:
return cmp((ayy,amm,add), (byy,bmm,bdd))