【发布时间】:2014-08-31 22:00:48
【问题描述】:
注意: python3中的代码示例,但问题也适用于python2(将.keys替换为.viewkeys等)
dict 对象提供(有时)支持集合操作的视图方法:
>>> {'a': 0, 'b': 1}.keys() & {'a'}
{'a'}
>>> {'a': 0, 'b': 1}.items() & {('a', 0)}
{('a', 0)}
但值视图不支持集合运算符:
>>> {'a': 0, 'b': 1}.values() & {0}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'dict_values' and 'set'
我知道 dict 值可以是不可散列的对象,因此并不总是可以创建一组值,但是 dict.items 也是如此,这里仅设置操作.items 一旦在 dict 中存在不可散列的类型,就会在运行时失败,而 .values 的设置操作会立即失败。
文档提到 Values views are not treated as set-like since the entries are generally not unique,但这似乎不是一个令人信服的理由 - 例如,python 不会阻止您创建像 {0, 0, 1, 2} 这样的集合文字。
这种行为不一致的真正原因是什么?
【问题讨论】:
-
然而,设置文字将忽略重复项。一般来说,您不希望在 dict 视图中发生这种情况。
-
@MartijnPieters 我不相信,一个 dictview 和一个集合的集合交集返回另一个集合,那么在这个阶段删除重复项会有什么问题? dictview 当然仍然可以包含欺骗。
-
显式优于隐式;然后将值字典视图转换为集合。
-
@MartijnPieters 你认为它可能已经实现了吗,理论上,它根本就没有通过设计选择来实现?
-
original PEP 没有提及它。但是行为必须是一致的,并且对于不可散列的类型等不会突然失败。要求显式转换为集合会使这一点更加更清晰,符合 Python 设计理念。
标签: python dictionary set dictview