TypeError:|:'list'和'list'的不支持的操作数类型

wub*_*000 4 python dictionary list-comprehension set

在Python中,我想编写一个列表解析来迭代2个字典的键的并集.这是一个玩具示例:

A = {"bruno":1, "abe":2}.keys()
B = {"abe":5, "carlton":10}.keys()

>>>[ k for k in A | B ]
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Traceback (most recent call last)
<ipython-input-221-ed92ac3be973> in <module>()
      2 B= {"abe":5, "carlton":10}.keys()
      3 
----> 4 [ k for k in A|B]

TypeError: unsupported operand type(s) for |: 'list' and 'list'
Run Code Online (Sandbox Code Playgroud)

理解对于1个词典来说效果很好.例如:

>>>[ k for k in A]
['bruno', 'abe']
Run Code Online (Sandbox Code Playgroud)

不确定错误在哪里.我在教科书中跟随一个例子,根据这本书,这种类型的并集和交集运算符应该可以正常工作.请让我知道你的想法.谢谢.

Mar*_*ers 8

在Python 2中,dict.keys()是列表,而不是字典视图.dict.viewkeys()改为使用:

A = {"bruno":1, "abe":2}.viewkeys()
B = {"abe":5, "carlton":10}.viewkeys()

[k for k in A | B]
Run Code Online (Sandbox Code Playgroud)

您的示例可以在Python 3中使用,其中该.keys()方法已更改为默认情况下返回字典视图.

演示:

>>> A = {"bruno":1, "abe":2}.viewkeys()
>>> B = {"abe":5, "carlton":10}.viewkeys()
>>> [k for k in A | B]
['carlton', 'bruno', 'abe']
Run Code Online (Sandbox Code Playgroud)

听起来好像你的教科书假设你正在使用Python 3.切换教科书,或者使用Python 3来运行这些示例,在你获得Python 2和3之间差异的更多经验之前,不要试图将两者混合使用.

对于记录,一个字典视图支持具有一组操作|,^,-&针对任何迭代上的右手侧运营商; 所以以下工作也是如此:

A_dict = {"bruno":1, "abe":2}
B_dict = {"abe":5, "carlton":10}

[k for k in A_dict.viewkeys() | B_dict]
Run Code Online (Sandbox Code Playgroud)