将列表与dictviews进行比较

时间:2016-11-19 16:30:12

标签: python dictionary set dictview

Dictionary views"是类似于对象的对象"因此可用于将字典内容与其他对象进行比较。具体地,

  • key-views :set-like
  • value-views :not set-like
  • item-views :类似于if(key,value)对是唯一且可清除的

关键视图的类似集合的特性允许按位比较。在Python 3中,我们可以使用&运算符找到交集。

hex_ids = {'#b0a7aa': '9976', '#595f5b': '19367', '#9a8f6a': '24095'}
hex_ids.keys()
# dict_keys(['#595f5b', '#9a8f6a', '#b0a7aa'])

{'#c7ccc0', '#9a8f6a', '#8a8e3e'} & hex_ids.keys()
# {'#9a8f6a'}

奇怪的是,比较list和关键视图也是可能的:

['#c7ccc0', '#9a8f6a', '#8a8e3e'] & hex_ids.keys()
# {'#9a8f6a'}

listset对象通常无法以这种方式进行比较。

['#c7ccc0', '#9a8f6a', '#8a8e3e'] & set(['#595f5b', '#9a8f6a', '#b0a7aa'])
# TypeError: unsupported operand type(s) for &: 'list' and 'set'

['#c7ccc0', '#9a8f6a', '#8a8e3e'] & {['#595f5b', '#9a8f6a', '#b0a7aa']}
# TypeError: unhashable type: 'list'

除了像set一样,为什么可以使用按位运算符将键视图与列表进行比较?

测试:| Python 3.5.2 | Python 3.4.4 | Python 2.7.12(使用viewkeys())| IPython 5.0.0 |

1 个答案:

答案 0 :(得分:2)

它在dict_keys类型上使用__rand__方法("反映和","随机"的缩写)。请注意,只有在左操作数不支持相应操作并且操作数具有不同类型时才会调用反射函数,这种情况就是这种情况。

>>> {}.keys().__rand__
<method-wrapper '__rand__' of dict_keys object at 0x109948f18>

例如:

>>> {0:0, 1:1}.keys().__rand__([1, 2])
{1}

由于某些原因,这种方法没有针对集合实现,这就是为什么它不起作用:

>>> {0, 1}.__rand__([1, 2])
NotImplemented

我不知道这些遗漏的原因,但我怀疑它可能是#34;没有人费心去写它&#34;因为您可以明确地使用set.intersection