Oge*_*gen 8 python performance dictionary
我正在寻找最有效和pythonic(主要是高效)的方式来更新字典,但如果存在现有密钥则保留旧值.例如...
myDict1 = {'1': ('3', '2'), '3': ('2', '1'), '2': ('3', '1')}
myDict2 = {'4': ('5', '2'), '5': ('2', '4'), '2': ('5', '4')}
myDict1.update(myDict2) gives me the following....
{'1': ('3', '2'), '3': ('2', '1'), '2': ('5', '4'), '5': ('2', '4'), '4': ('5', '2')}
Run Code Online (Sandbox Code Playgroud)
注意两个词典中的键'2'是如何存在的并且曾经有过值('3','1')但现在它有myDict2('5','4')中键的值?
有没有办法以有效的方式更新字典,因为键'2'最终有值('3','1','5','4')?#in没有特别的顺序
提前致谢
我认为最有效的方法是这样的:
for k, v in myDict2.iteritems():
myDict1[k] = myDict1.get(k, ()) + v
Run Code Online (Sandbox Code Playgroud)
但update不幸的是,没有相当于你想要做的事情.
2 个就地更新操作有什么问题?
myDict2.update(myDict1)
myDict1.update(myDict2)
Run Code Online (Sandbox Code Playgroud)
说明:第一次更新将用 myDict1 中的值覆盖已经存在的键,并在 myDict2 中插入所有不存在的键值对。
第二次更新将用来自 myDict2 的值覆盖 myDict1 中已经存在的键,由于第一次操作,这些值实际上是来自 myDict1 本身的值。插入的任何新键值对都将来自原始 myDict2。
这当然取决于您不关心保留 myDict2 的事实
更新:使用 python3,您无需触摸 myDict2 即可执行此操作
myDict1 = {**myDict1, **myDict2, **myDict1}
Run Code Online (Sandbox Code Playgroud)
这实际上与
myDict1 = {**myDict2, **myDict1}
Run Code Online (Sandbox Code Playgroud)
输出
{'1': ('3', '2'), '3': ('2', '1'), '2': ('3', '1'), '4': ('5', '2'), '5': ('2', '4')}
Run Code Online (Sandbox Code Playgroud)