如果新值是以后的日期,请替换字典中的值

时间:2017-10-31 14:07:13

标签: python dictionary

我想从列表中创建字典。如果找到更晚的日期,我希望替换该值。

像这样:

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)}

使用更少的代码必须有一种更简单的方法。我怎样才能更有效率,也许是字典理解?

4 个答案:

答案 0 :(得分:3)

如果您将键值对的列表传递给dict,如果存在重复键,它会保留最后一对。因此,您可以先按日期时间值对列表进行排序,然后使用该排序列表构建字典:

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

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

修改

正如@HåkenLid在评论中指出的那样,key中不需要sorted函数,因为我们只关心第一个元素是否相同的顺序。所以我们可以说:

d = dict(sorted(values))

答案 1 :(得分:1)

我认为你的代码非常易读,所以我不会试图强制对它进行字典理解。也许简化一下if语句?

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

这是有效的,因为只有在d[k]<v显示该密钥存在时才会执行k not in d

答案 2 :(得分: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))

答案 3 :(得分:-1)

试试这个,

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