字典之间不一致的行为.项和值



注意: 代码示例在python3中,但这个问题也适用于python2(将.keys替换为.viewkeys等)

dict对象提供视图方法(有时)支持集合操作:

>>> {'a': 0, 'b': 1}.keys() & {'a'}
{'a'}
>>> {'a': 0, 'b': 1}.items() & {('a', 0)}
{('a', 0)}

但是values视图不支持集合操作符:

>>> {'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视图不被视为类集合,因为条目通常不是唯一的,但这似乎不是一个令人信服的理由-例如,python不会阻止您创建像{0, 0, 1, 2}这样的集合字面量。

这种行为不一致的真正原因是什么?

如果我们作为一个集合来处理,就会使值字典视图成为一个非常昂贵的对象。在使用作为集合之前,必须计算所有值的哈希值;你真的不希望对一个大的字典这样做,特别是如果你不知道是否所有的值都是可哈希的。

因此,将

保留为显式操作要好得多;如果你想把这些值当作一个集合,显式地使它成为一个集合:

values = set(yourdict.values())

dict.items()行为源于这样一个事实,即我们事先知道键至少是唯一的,所以每个(键,值)对也是唯一的;在后台,您可以将成员资格测试委托给键字典视图。

但是一旦你在上面使用集合操作(交集,并集等),你就创建了一个新的set对象,而不是一个字典视图。对于这样的set对象,(键,值)对中的两个元素必须是可哈希的,因为通用的set类型不能对键做出相同的假设,也不能维护该约束(因为{'a': 0}.items() & {('a', 1)}是完全合法的,但会导致重复的键)。

原因是它没有在dict_values类型中实现,或者因为dict_values类特别禁止它。

由于您的值通常是一个非唯一的项目列表,因此将其转换为集合不是一个好主意。如果你想这样做,只需手动转换它。我的假设是不允许这样做,因为这通常是一个坏主意,因为它可能导致数据丢失。

因为在dict中不能有重复的keys值,但可以有重复的values值:

>>> d = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
>>> d.keys()
[0, 1, 2, 3, 4]
>>> d.values()
[0, 0, 0, 0, 0]
>>> d.items()
[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0)]

keys()方法返回一些像set一样的东西,因为你不能在dict上有重复的键,但你可以在values()上有重复的值。这就是为什么keys嘎嘎叫和鸭子像一组,而values嘎嘎叫和鸭子像一个list

如果您使用leetcode编码,那么您可以通过更改

的结果来实现。
return res_dic.values()

return list(res_dic.values())

最新更新