de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 koblas
koblas
質問

日付比較を簡略化する

私はリストソート関数(例えば、 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)
1 2011-10-27T20:26:01+00:00 5
 koblas
koblas
編集された質問 27日 10月 2011 в 8:32
プログラミング
python
Mark Byers
27日 10月 2011 в 8:29
2011-10-27T20:29:23+00:00
さらに
ソース
編集
#56792835

cmp の代わりに key を使用できます。 キー関数を書く方がはるかに簡単で、1行で行うことができます。

date_list.sort(key = lambda s: datetime.strptime(s, '%m/%d/%Y'))

このインポートが必要になります:

from datetime import datetime
2
0
Mark Ransom
27日 10月 2011 в 8:42
2011-10-27T20:42:57+00:00
さらに
ソース
編集
#56792837

日付変換を忘れて、これを文字列として行うことができます。それらを正しい順序に並べ替えるだけです。

amm, add, ayy = a.split('/')
bmm, bdd, byy = b.split('/')
return cmp(ayy+amm+add, byy+bmm+bdd)

ISO日付形式を使い、比較のために物事を適切な順序で並べ替えることを好む: YYYY-MM-DD 。また、海の向こうに誤解されないという利点もあります。

1
0
Michael C. O'Connor
27日 10月 2011 в 8:38
2011-10-27T20:38:28+00:00
さらに
ソース
編集
#56792836

これらの値を実際の日付に変換するのは確かにクリーンです(速度はそれほど重要である場合はベンチマークする必要があります)。

def dcmp(a, b):
    from datetime.datetime import strptime
    return strptime(a,'%m/%d/%Y') > strptime(b,'%m/%d/%Y')
0
0
Kirk Strauser
27日 10月 2011 в 9:17
2011-10-27T21:17:13+00:00
さらに
ソース
編集
#56792838

あなたの月と日のすべてがゼロ詰めであり、あなたの日付が "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.

0
0
koblas
28日 10月 2011 в 6:06
2011-10-28T18:06:31+00:00
さらに
ソース
編集
#56792839

私が探していたのは、このコードだけを置き換えることでした(日付は無視されます)

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))
0
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 1週間前
2
Hideo Nakagawa
登録済み 1週間前
3
Sergiy Tytarenko
登録済み 1週間前
4
shoxrux azadov
登録済み 1週間前
5
Koreets Koreytsev
登録済み 2週間前
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属