documentation for set operations人说:

注意,union()、intersection()的非运算符版本,

通过以下实验来测试这一点:

# Python 3.10.2 (main, Jan 15 2022, 19:56:27) [GCC 11.1.0] on linux

>>> set('ab') & set('ac')
{'a'}
# works, as expected

>>> set('ab') & 'ac'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'set' and 'str'
# doesn't work, as expected

>>> set('ab') & list('ac')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'set' and 'list'
# doesn't work, as expected

>>> set('ab') & iter('ac')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'set' and 'str_iterator'
# doesn't work, as expected

>>> set('ab') & dict(zip('ac', 'ac')).keys()
{'a'}
# works??

>>> type({}.keys())
<class 'dict_keys'>

>>> isinstance({}.keys(), (set, frozenset))
False

所以,这里有一个悖论:

  • set操作员&处理dict_keys个对象;
  • 文件中说,它应该只适用于集合;
  • dict_keys个对象不是集合.

为什么set运算符&与dict_keys对象一起工作?还有其他类型的可以使用吗?如何找到这些类型的列表?

推荐答案

这不是一个完整的答案,但dict_keyscollections.abc.Set的例子:

from collections.abc import Set
k = dict(zip('ac', 'ac')).keys()
print(isinstance(k, Set))  # -> True

Python-3.x相关问答推荐

使用Python装载. iso文件

数组列的极点成对求和

在Pandas 数据帧中为小于5位的邮政编码添加前导零

以特定方式重新排列 pandas 数据框的列

torch.stack([t1, t1, t1], dim=1)与torch.hstack([t1, t1, t1])之间有什么区别?

如何创建与导航抽屉一起使用的导航栏

TypeError: issubclass() arg 1 在 Flask 中导入 langchain 时必须是一个类

Pandas groupby 然后 for each 组添加新行

我想使用命令提示符安装 cv2

如何转置和 Pandas DataFrame 并命名新列?

使用 multiprocessing 处理图像

Python:如何在Pandas 的 .agg 函数中使用 value_counts()?

如何通过从特定列创建分组多标题来reshape 数据框?

无法使用 Python 和 Selenium 检索 href 属性

错误:预期语句,发现 py:Dedent

Pythonic,自定义警告

Jupyter Notebook - 在函数内绘图 - 未绘制图形

清除 PyCharm 运行窗口

如何修复:cx_Oracle.DatabaseError:DPI-1047:找不到 64 位 Oracle 客户端库 - Python

在 PyCharm 中配置解释器:请使用不同的 SDK 名称