返回信息流任务:
有多个字典,每个字典的value都是整数。比如:
d1 = {"a": 1, "b": 2, "c": 3}
d2 = {"b": 4, "d": 5, "e": 6}
d3 = {"b": 3, "c": 1, "e": 1}
要求生成一个新的字典。字典的key是几个字典的并集,字典的value是各个字典该value的值的和。比如,合并上述字典,就应该是:
d = {"a": 1, "b": 9, "c": 4, "d": 5, "e": 7}
要简短的代码,但不要太低效。
先弄一个标程,最好不要比这个还麻烦。
def merge(ds):
r = {}
for d in ds:
for k in d:
if k in r:
r[k] += d[k]
else:
r[k] = d[k]
return r
d = merge([d1,d2,d3])
这是一条镜像帖。来源:北邮人论坛 / python / #5228同步于 2015/2/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
[挑战]合并字典
nuanyangyang
2015/2/23镜像同步30 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这样可以吗
def merge(ds):
return dict((k, sum(d.get(k, 0) for d in ds)) for k in set(reduce(lambda x, y: x + y, [d.keys() for d in ds])))
merge([d1, d2, d3])
【 在 glazard 的大作中提到: 】
: 这样可以吗
: [code=python]
: def merge(ds):
: ...................
有改进的余地。比如Python3有dict comprehension。set有|运算符
没想到什么好办法……脑洞大开系列……
刚学,好多都不太懂
import re
d1 = {"a": 1, "b": 2, "c": 3}
d2 = {"b": 4, "d": 5, "e": 6}
d3 = {"b": 3, "c": 1, "e": 1}
def merge(ds):
env={}
result={}
a=str(ds)
a=re.sub(r"[{'}\[\]]",'',a)
a=a.replace(', ','\n')
copy=re.sub(r'(:.+)','=0',a)#用于构造声明
a=a.replace(':','+=')
a=copy+'\n'+a
exec(a,env)
for i in env:
if(i!='__builtins__'):
result[i]=env[i]
return result
print(merge([d1,d2,d3]))
【 在 Ncer 的大作中提到: 】
: 没想到什么好办法……脑洞大开系列……
: 刚学,好多都不太懂
: [code=py]
: ...................
嗯。可以去参加世界混乱代码大赛了。
谢暖神指点
【 在 nuanyangyang 的大作中提到: 】
:
: 有改进的余地。比如Python3有dict comprehension。set有|运算符
【 在 awsxsa 的大作中提到: 】
: [code=python]
: def merge(ds):
: for d in ds[1:]: #ds[0] is useful
: ...................
说了返回新的字典
d = {k:sum(d.get(k,0) for d in ds)for k in set(k for d in ds for k in d)}
来自「北邮人论坛手机版」