Joh*_*Dow 20 python python-3.x
我试着总结两个这样的词典:
my_new_dict = dict(my_existing_dict.items() + my_new_dict.items())
Run Code Online (Sandbox Code Playgroud)
但收到错误
TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
Gar*_*tty 31
从PEP 448(Python 3.5)开始,我推荐一个非常简单易读的解决方案:
{**d1, **d2}
Run Code Online (Sandbox Code Playgroud)
您现在可以在文字和多个拆包中提供拆包,这意味着可行.
一个问题是你想要的行为是模棱两可的 - 词典不能有重复的键,所以如果两个键包含相同的键,则不清楚你想要发生什么.该规范明确指出使用此方法时应该发生的事情:
在词典中,后面的值将始终覆盖先前的值
如果您想要反向行为,只需在文字中交换字典的顺序即可.如果要抛出异常,可以使用dict()
不接受重复参数的方法,即:
dict(**d1, **d2)
Run Code Online (Sandbox Code Playgroud)
在旧版本的Python 3中,您的方法是有效的,但这里的问题是字典视图是类似设置的,因此它们没有实现添加.
你可能想要的是union : d1.items() | d2.items()
,它将为你提供一组元组(key, value)
.如果你然后将它传递给dict()
并且有重复,那么"last"值将是所使用的值,但是set(与视图本身不同)是无序的,因此无法保证哪个项目最终会在"组合"中结束设置,意味着哪一个"胜利"将是任意的.
所以,简而言之,只要订单不重要:
dict(d1.items() | d2.items())
Run Code Online (Sandbox Code Playgroud)
请注意,在Python 2中,dict.items()
只需返回a list
,您的方法将起作用.
mgi*_*son 25
在python3中,dict.items()
返回一个dict_items
显然无法添加的类型的对象.(在python 2中,它返回了一个list
可以添加的内容).
另一种添加一对可在py2k和py3k上运行的字典的方法:
d = dict1.copy()
d.update(dict2)
Run Code Online (Sandbox Code Playgroud)
当然,在关键碰撞的情况下,你想要发生什么有些含糊不清.例如,如果两个dicts都有key1
,key1
哪个应该保留在输出中?或者你应该使用他们两个值的某种组合?在后一种情况下,你可能会想从什么collections
模块(或defaultdict
或Counter
)
erw*_*man 10
其他建议答案的另一种方法是:
dict(list(d1.items()) + list(d2.items()))
如果d1
and中都存在键,则 ind2
的值d2
将用于最终字典中。
归档时间: |
|
查看次数: |
32577 次 |
最近记录: |