2

yyyy-mm-ddの形式のキーとして文字列を含む辞書があり、日付が最も早いキーで辞書を並べ替えたいと考えています。

私は現在使用してsorted(datesAndText.keys())いますが、月と日のフィールドが常にゼロで埋められるとは限らないため、これは確実に機能していません。

Python辞書を日付キーで並べ替えるのを見てきました。日付が文字列の場合、Pythonでこのリストを並べ替えるにはどうすればよいですか?しかし、特定の場合にそれらを採用することはできないようです。

4

3 に答える 3

8

キーが正確にフォーマットされていることを確認します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

于 2012-10-10T13:56:43.487 に答える
2

形式の日付はyyyy-mm-dd、アルファベット順と時系列の両方で同じ方法で並べ替えられるため、標準を使用できますsorted

for k, v in sorted(datesAndText.items()):
    # do something with key and value
于 2012-10-10T13:53:18.823 に答える
2

フォーマット、、は辞書式順序を許可するため、値がゼロで埋められていない限り(の代わりにyyyy-mm-ddex )、コードは正常に機能するはずです。2012-10-92012-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.

于 2012-10-10T14:00:30.447 に答える