为什么我可以使用按位AND检查列表是否包含字典的键?

时间:2015-08-21 16:03:06

标签: python dictionary bit-manipulation

我碰巧偶然发现了这个问题Python - intersection between a list and keys of a dictionary,遗憾的是没有要求的声誉:

为什么这样做?

d1 = {'200:200':{'foo':'bar'},'300:300':{'foo':'bar'}}
l1 = ['200:200', '90:728']
keys = d1.keys() & l1

3 个答案:

答案 0 :(得分:1)

它的工作原理是因为您使用的是Python 3. d1.keys()返回一个列表(Python 2)或类型为<class dict_keys>的对象。 (Python 3),l1是一个列表。在Python 2案例中,最终语句给出了TypeError: unsupported operand type(s) for &: 'list' and 'list'。在Python 3中,dict_keys对象是一个可迭代的视图,显然确实具有用于实现__and__()操作的&方法的某种实现。

答案 1 :(得分:1)

d1.keys()的结果是一个类似于视图的设置。

  

键视图设置类似,因为它们的条目是唯一且可清除的。如果所有值都是可清除的,那么(键,值)对是唯一且可清除的,那么items视图也是类似于set。 (值视图不会被视为类似集合,因为条目通常不是唯一的。)对于类似集合的视图,可以使用为抽象基类collections.abc.Set定义的所有操作(例如,==,&lt) ;,或^)。

来自https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects

&的第二个参数只需要是可以对象的可迭代对象(尽管文档中没有说明这一点)。

请参阅https://docs.python.org/3/library/stdtypes.html#set.intersection

答案 2 :(得分:0)

它在python3(至少3.4.3)中工作,因为dict#keys返回dict_keys的实例,它显然实现了set接口的(部分?)。并且set类型具有一些具有不同(但相似)含义的中缀整数运算符的实现。