yyyy-mm-ddの形式のキーとして文字列を含む辞書があり、日付が最も早いキーで辞書を並べ替えたいと考えています。
私は現在使用してsorted(datesAndText.keys())
いますが、月と日のフィールドが常にゼロで埋められるとは限らないため、これは確実に機能していません。
Python辞書を日付キーで並べ替えるのを見てきました。日付が文字列の場合、Pythonでこのリストを並べ替えるにはどうすればよいですか?しかし、特定の場合にそれらを採用することはできないようです。
yyyy-mm-ddの形式のキーとして文字列を含む辞書があり、日付が最も早いキーで辞書を並べ替えたいと考えています。
私は現在使用してsorted(datesAndText.keys())
いますが、月と日のフィールドが常にゼロで埋められるとは限らないため、これは確実に機能していません。
Python辞書を日付キーで並べ替えるのを見てきました。日付が文字列の場合、Pythonでこのリストを並べ替えるにはどうすればよいですか?しかし、特定の場合にそれらを採用することはできないようです。
キーが正確にフォーマットされていることを確認しますyyyy-mm-dd
か?例えば:
>>> '2010-1-15' < '2010-02-15'
False
あなたはこのようなものをソートすることを余儀なくされるかもしれません:
sorted(d,key=lambda x: [int(y) for y in x.split('-')])
別の解決策(あなたの年がすべて4桁であると仮定):
sorted(d,key=lambda x: [y.zfill(2) for y in x.split('-')])
どちらが速いかわかりません。の候補だと思いますtimeit
。
形式の日付はyyyy-mm-dd
、アルファベット順と時系列の両方で同じ方法で並べ替えられるため、標準を使用できますsorted
。
for k, v in sorted(datesAndText.items()):
# do something with key and value
フォーマット、、は辞書式順序を許可するため、値がゼロで埋められていない限り(の代わりにyyyy-mm-dd
ex )、コードは正常に機能するはずです。2012-10-9
2012-10-09
文字列ではなく日付の比較に依存することで、この問題を修正します。
sorted(datesAndText, key=lambda x: datetime.strptime(x, '%Y-%m-%d'))
これは、ソートするパラメーターを利用しkey
ます。これは、1つの引数(ソート中に比較されるリストの要素)を受け入れ、ソートに使用できる値を返す関数sorted
です。
これには、データを変更する必要がある場合に、日付の文字列形式を明示的に指定できるという補助的な利点があります。
編集:
mgilson brought up an interesting point. str.split
is probably more efficient. Let's see if he's correct:
strptime
solution:
bburns@virgil:~$ python -mtimeit -s"from datetime import datetime;d={'2012-2-12':None, '2012-10-9':None, '1978-1-1':None, '1985-10-9':None}" 'sorted(d, key=lambda x: datetime.strptime(x,"%Y-%m-%d"))'
10000 loops, best of 3: 79.7 usec per loop
mgilson's original str.split
solution:
bburns@virgil:~$ python -mtimeit -s"from datetime import datetime;d={'2012-2-12':None, '2012-10-9':None, '1978-1-1':None, '1985-10-9':None}" 'sorted(d,key=lambda x: [int(y) for y in x.split("-")])'
100000 loops, best of 3: 17.6 usec per loop
mgilson's zfill
str.split
solution:
bburns@virgil:~$ python -mtimeit -s"from datetime import datetime;d={'2012-2-12':None, '2012-10-9':None, '1978-1-1':None, '1985-10-9':None}" 'sorted(d,key=lambda x: [y.zfill(2) for y in x.split("-")])'
100000 loops, best of 3: 7.4 usec per loop
Looks like he's correct! mgilson's original answer is 4-5 times faster, and his final answer is 10-11 times faster! However, as we agreed in the comments, readability matters. Unless you're presently CPU-bound, I'd still advise going with datetime.strptime
over str.split
.