TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
我试着总结两本这样的字典:
1
| my_new_dict = dict(my_existing_dict.items() + my_new_dict.items()) |
但是接收错误
1
| TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items' |
我做错了什么?
- 旁注:如果你想迭代两个字典,并且你知道它们有唯一的键(或者你处理同一个键两次并不重要),考虑使用itertools.chain(dict_a,dict_b)
由于PEP 448(Python 3.5),这是一个非常简单的解决方案和readable我会推荐:
现在,你可以选择不同的unpackings literals和unpackings,这意味着这家厂。
一个问题是,你想是的不良行为ambiguous -英语词典无法复制的钥匙,所以它是unclear发生,如果你想使用相同的两个关键。明确的规格是关于什么应该发生,当使用这个方法:
In dictionaries, later values will always override earlier ones
如果你想要一个反向的行为,你可以互换的经济秩序的literal英语词典。如果你想把一个例外,你可以使用一个dict()方法不会接受语言复制的论点,i.e:
在你的Python versions 3时,方法是有效的,但这里的问题是,这套字典视图是一样的,所以,他们不必加。
你可能想:d1.items() | d2.items()的联盟,这将给你的tuples (key, value)设置的。如果你再把它duplicates dict()和友好的"最后一个"的值将被使用。(3 unlike的观点是可取的unordered),所以有一个好的担保,这将结束了"第一"的项目集的结合,是一个"七",这将arbitrary。
所以,总之,只要不是秩序/复制的重要:
1
| dict(d1.items() | d2.items()) |
注意,在Python的简单和list2,dict.items()返回,在将你的工作方法。
- 当我尝试这个的时候,我得到:TypeError: unhashable type: 'dict'。
- 救命!好把戏,我的朋友!
- 在python 3.6.1中,我注意到如果一个项目同时在d1和d2中,那么dict(d1.items() | d2.items())会导致d1的项目在出现重复时生效,这不是我所期望的。dict(list(d1.items()) + list(d2.items()))的表现和我预料的一样,如果出现重复,d2获胜。
- @是的,集合是无序的,而字典(现在)是有序的。我的措词有误导性,因为"last"在任意排序集合时意义不大。如果您想要保留顺序,那么您确实需要使用一个像列表这样的有序集合(在构建它们的过程中只需花费一点额外成本)。
- @埃尔瓦曼看到我最新的编辑更新的方法,我认为是最好的选择在所有情况下。
- 很酷,@garethratity!感谢您更新您的答案。
在python3 dict.items()返回一个对象的类型,dict_items显然不会是非常好的。(在Python语言和2,它可能是一个list返回)。
一个另类的方式添加和互惠的词典和py3k:他py2k厂。
1 2
| d = dict1.copy()
d.update(dict2) |
的课程,有一些关于你想ambiguity collisions的情况下发生的关键。例如,如果有两个dicts key1的key1,应该是preserved的输出?或如果你使用的都是一些组合的价值吗?在英国移民的情况下,你可能想要的东西会从collections模块(用户或Counterdefaultdict)
- 谢谢,它起作用了!我讨厌2.7>3.2迁移…
- @弗拉迪斯拉夫:你真的应该看医生。
- @米吉尔森:我认为3+中的dict.items()相当于2.6中的dict.iteritems(),也就是说,它是一个迭代器。
- @不,它返回一个字典视图,它是一个集合状容器(见我的答案)。
- @很好,我接受纠正(并且更多的学习…)
- @皮耶雷格姆——每天学习新东西是件好事。
另一个方法是:三月是一个语音的位置
dict(list(d1.items()) + list(d2.items()))
如果有两个d1是目前在d2键和值,在d2最终将字母词典。