我正在尝试将两个字典放入单个(新)字典中,但我一直遇到问题。我收到此错误消息:
'NoneType' object is not iterable
这没有意义,因为我在我的函数中定义了r1和r2:
def combine_report(r1, r2):
to_merge=[r1,r2]
d={}
for m in to_merge:
for k,v in m.items():
d.setdefault(k,{}).update(v)
return d
答案 0 :(得分:1)
您应该直接在.update()
上使用d
:
def combine_report(r1, r2):
d = r1.copy()
d.update(r2)
return d
你试图将键设置为空字典,然后在那些只有值的字符上调用.update()
;这要求该值 iterable ;如果您的某个值None
导致您的特定例外:
>>> {}.update(None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable
您的版本可以通过使用简单的项目分配来“修复”:
def combine_report(r1, r2):
to_merge = [r1, r2]
d={}
for m in to_merge:
for k, v in m.items():
d[k] = v
return d
但是使用我的版本中显示的.update()
会更有效率。
如果必须在每个键的列表中保留所有值,请使用:
def combine_report(r1, r2):
d = {}
for m in to_merge:
for k, v in m.items():
d.setdefault(k, []).append(v)
return d
此处,dict.setdefault()
将返回键k
的值,但如果k
尚未存在,则设置默认值(此处为列表)。
答案 1 :(得分:0)
而不是
d.setdefault(k,{}).update(v)
你应该选择
d.setdefault(k,[]).append(v)
因为,您尝试使用值更新字典。您实际需要的是与键对应的值列表。所以,整个程序就像这样
def combine_report(r1, r2):
to_merge, d = [r1,r2], {}
for m in to_merge:
for k,v in m.items():
d.setdefault(k,[]).append(v)
return d
print(combine_report({"1":"a"}, {"1":"b"}))
<强>输出强>
{'1': ['a', 'b']}