闲聊一句
因为看到别人在代码里自行写了个合并字典的方法,于是决定来写个文章记录下自己所想
正题
对于字典合并这个事,你最先想到的是什么呢?
对于字典合并,要求存在相同的键时,不更新掉值,你最先想到的又是什么呢?
你可以先想下,然后再继续看下去。
因为需要,运行代码均加了时间计算。
时间计算因为各种原因,会有差别。
*注:time.lock()在python3.8已经不用了。
update
这个是很常用的方法
d1={'a':1,'b':2,'c':3}
d2={'d':4,'b':5,'e':6}
d1.update(d2)
字典构造器-关键字参数
需字典的键是字符串才可用,否则会报TypeError: keywords must be strings。
d1={'a':1,'b':2,'c':3}
d2={'d':4,'b':5,'e':6}
d=dict(d1, **d2)
推导式
d1={'a':1,'b':2,'c':3}
d2={'d':4,'b':5,'e':6}
d={k: v for d in [d1, d2] for k, v in d.items()}
元素拼接
d1={'a':1,'b':2,'c':3}
d2={'d':4,'b':5,'e':6}
d=dict(list(d1.items())+list(d2.items()))
chain
from itertools import chain
d1={'a':1,'b':2,'c':3}
d2={'d':4,'b':5,'e':6}
d=dict(chain(d1.items(), d2.items()))
ChainMap
from collections import ChainMap
d1={'a':1,'b':2,'c':3}
d2={'d':4,'b':5,'e':6}
d=dict(ChainMap(d1, d2))
写for(别人写的)
d1 = {'a': 1, 'b': 2, 'c': 3}
d2 = {'d': 4, 'b': 5, 'e': 6}
keys_1 = d1.keys()
keys_2 = d2.keys()
list_keys = list(keys_1) + list(keys_2)
dict_3 = {}
for i in list_keys:
if i in list(keys_1):
dict_3[i] = d1[i]
elif i in list(keys_2):
dict_3[i] = d2[i]
总结
对于简单的字典:
方式 | 示例 | 时间 | 说明 |
---|---|---|---|
update | d1.update(d2) | 1.09999999997612e-06 | 直接更新掉d1。对于同名的键会覆盖 |
字典构造器-关键字参数 | d=dict(d1, **d2) | 1.6999999999933735e-06 | 会合并到一个新的字典,d1、d2均保留原值。对于同名的键会覆盖。键名需为string类型。 |
推导式 | d={k: v for d in [d1, d2] for k, v in d.items()} | 1.8399999999973993e-05 | 会合并到一个新的字典,d1、d2均保留原值。对于同名的键会覆盖。 |
元素拼接 | d=dict(list(d1.items())+list(d2.items())) | 3.700000000050885e-06 | 会合并到一个新的字典,d1、d2均保留原值。对于同名的键会覆盖。 |
chain | d=dict(chain(d1.items(), d2.items())) | 3.3000000000393825e-06 | 会合并到一个新的字典,d1、d2均保留原值。对于同名的键会覆盖。 |
ChainMap | d=dict(ChainMap(d1, d2)) | 0.0015589000000000297 | 会合并到一个新的字典,d1、d2均保留原值。对于同名的键不会覆盖。 |
写for | 8.499999999966867e-06 |
时间由小到大排序为:[‘update’, ‘字典构造器-关键字参数’, ‘chain’, ‘元素拼接’, ‘自己写for’, ‘推导式’, ‘ChainMap’]