19

我正在尝试使用另一个字典中的值更新大型字典的某些值,其中它们具有相似的键(相同的日期但格式不同)。我目前正在使用的过程太慢,我想减少瓶颈。

这是我当前的解决方案(它将更新的字典写入文件):

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()
4

2 回答 2

32

您应该使用该update方法来合并字典:

b.update(d)

.

目前,您正在迭代... 中d的每个键,b这很慢。您可以通过设置两个具有匹配键的字典来解决此问题(并且相等的日期将散列相同 -也许这里要注意的很酷的事情是 datetime 对象散列):

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]
于 2012-10-03T22:25:07.363 回答
3

建议更改:

  1. 使用.iteritems()而不是.items(). 你有它的方式,在内存中创建一个对列表并迭代,这是浪费的。
  2. 您说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
于 2012-10-03T23:14:11.850 回答