类型错误:不支持位运算符“|”:'list'和'list'。

4
在Python中,我想要编写一个列表推导式来迭代2个字典键的并集。这里是一个玩具示例:
A = {"bruno":1, "abe":2}.keys()
B = {"abe":5, "carlton":10}.keys()

>>>[ k for k in A | B ]

我遇到了以下错误:

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'

理解在1个字典中运作正常。例如:

>>>[ k for k in A]
['bruno', 'abe']

我不确定错误出在哪里。我正在按照教材上的例子进行操作,该教材指出这种联合和交集运算符应该可以正常工作。请告诉我您的想法。谢谢。


[ k for k in set(A) | set(B) ] - Arvind
我认为你不需要遍历键列表。
set(A + B) set(['carlton','bruno','abe'])
- Tanveer Alam
@Arvind:在Python 2中有更高效的方法来完成这个任务。在Python 3中,发布的代码可以工作,这就是问题所在。 - Martijn Pieters
1
@TanveerAlam:或者set(A).union(B) - Martijn Pieters
1个回答

9
在Python 2中,dict.keys()返回的是一个列表,不是字典视图。应该使用dict.viewkeys()代替:
A = {"bruno":1, "abe":2}.viewkeys()
B = {"abe":5, "carlton":10}.viewkeys()

[k for k in A | B]

你的例子在 Python 3 中可以工作,因为 .keys() 方法 默认返回一个字典视图。

演示:

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

似乎你的教材假定你使用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]

很好的解释!虽然 [ k for k in set(A) | set(B) ] 也能给出正确的结果。使用它有什么问题吗?只是好奇。 :) - Arvind
1
@Arvind:那样会远远不够高效,因为你首先要从键中创建两个列表,然后再从这些列表创建两个集合。这是我发布的版本的简化版,会创建大量额外的对象(在C代码中有额外的循环)。 - Martijn Pieters
1
@Arvind:字典视图是轻量级对象,利用了字典已经实现了大部分集合操作所需的功能。 - Martijn Pieters
1
如果你选择这种方法,你需要直接在其中一个字典上调用set()(而不是在.keys()结果上调用),然后使用.union()方法传入另一个字典。这样至少可以避免创建太多的中间对象。但仍然会比较慢。 - Martijn Pieters
谢谢你的解释,兄弟。我觉得我需要更多地探索。 - Arvind
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接