2017-10-31 9 views
1

リストから辞書を作成したいとします。私は、後の日付が見つかった場合には値を置き換えることを望みます。新しい値が新しい日付の場合は、辞書の値を置き換えます。

import datetime 

values=[['A',datetime.date(2017,1,1)], 
     ['B',datetime.date(2001,2,2)], 
     ['A',datetime.date(2017,10,21)], 
     ['B',datetime.date(2005,6,3)]] 
d={} 

for (k,v) in values: 
    if k not in d: 
     d[k]=v 
    else: 
     if d[k]<v: 
     d[k]=v 

print(d) 
{'B': datetime.date(2005, 6, 3), 'A': datetime.date(2017, 10, 21)} 

少ないコードで簡単な方法がなければならない。このよう

。これをもっと効率的にするにはどうしたらいいですか?

答えて

3

キーの値のペアをdictに渡すと、重複するキーがある場合は最後のペアが保持されます。だから、あなたはまずdatetime値によって、あなたのリストをソートし、そのソートされたリストを使用して辞書を構築することができ:

d = dict(sorted(values, key=lambda x: x[1])) 

print(d) 
{'A': datetime.date(2017, 10, 21), 'B': datetime.date(2005, 6, 3)} 

EDIT

@HåkenLidはコメントで指摘するように、あなたがする必要はありませんkeysortedで機能します。なぜなら、最初の要素が同じであれば、順序が気になるからです。だから我々はちょうど言うことができる:

d = dict(sorted(values)) 
+0

これは読みやすくするために2行(個人的な好み)にしています。 +1 –

+1

カスタムキー機能は必要ありません。この場合、デフォルトのソートも同様に機能します。 'dict(sorted(values)))' –

1

あなたのコードはそのまま読めると思いますので、私はそれに辞書の理解を強制しようとしません。たぶんifステートメントを単純化するのでしょうか?

for (k,v) in values: 
    if k not in d or d[k]<v: 
     d[k]=v 

k not in dは、そのキーが存在することが示されている場合d[k]<vにのみ実行されますので、これは動作します。

-1

は三条件と

{k[0]:k[1] for k in values} 
+0

'values'がソートされていなければ、正しい結果は得られません。 –

0

ソリューション、これを試してみてください。

for k, v in values: 
    d[k] = max(v, d[k]) if k in d else v 

またはデフォルト値でdict.get()を使用。

for k, v in values: 
    d[k] = max(v, d.get(k, v)) 
関連する問題