将两个词典合二为一

时间:2013-11-24 02:58:34

标签: python python-3.x dictionary

我正在尝试将两个字典放入单个(新)字典中,但我一直遇到问题。我收到此错误消息:

'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

2 个答案:

答案 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']}