我正在尝试使用来自另一个字典的值来更新大字典的某些值,在这些字典中,它们具有相似的键(相同的日期,但格式不同)。我目前使用的过程太慢,我想减少瓶颈。
这是我目前的解决方案(它将更新的dict写入文件):
from dateutil import parser
File = open(r'E:Test1.txt','w')
b = {'1946-1-1':0,..........,'2012-12-31':5}
d = {'1952-12-12':5,........,'1994-7-2':10}
for key1, val1 in b.items():
DateK1 = parser.parse(key1)
Value = val1
for key2, val2 in d.items():
DateK2 = parser.parse(key2)
if DateK1 == DateK2:
d[key2] = Value
Order= sorted(d.items(), key=lambda t: t[0])
for item in Order:
File.write('%s,%s\n' % item)
File.close()
答案 0 :(得分:18)
您应该使用update
方法合并字典:
b.update(d)
目前,您正在为d
中的每个密钥迭代b
...这很慢。您可以通过设置两个具有匹配键的字典来解决这个问题(相同的日期将使用相同的哈希值 - 这里可能需要注意的很酷的事情是日期时间对象哈希):
b1 = dict( (parser.parse(k),v) for k,v for b.iteritems() )
d1 = dict( (parser.parse(k),v) for k,v for d.iteritems() )
d1.update(b1) # update d1 with the values from b1
我刚刚意识到你没有完全进行更新,因为只有那些共享值正在更新,所以相反(再次只是迭代一次):
for k_d1 in d1:
if k_d1 in b1:
d1[k_d1] = b1[k_d1]
答案 1 :(得分:2)
建议的更改:
.iteritems()
代替.items()
。你拥有它的方式,在内存中创建一对对列表并进行迭代,这很浪费。b
和d
之间的日期格式不同。我猜这个月和白天都换了?如果是这样,您仍然可以通过计算d
密钥然后检查成员资格来节省大笔资金。包含更改的代码:
def switch_month_day(datestr):
fields = datestr.split("-")
return "%s-%s-%s" % (fields[0], fields[2], fields[1])
for key, val in b.iteritems():
DateK = switch_month_day(key)
if DateK in d:
d[DateK] = val