我碰巧偶然发现了这个问题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
答案 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
类型具有一些具有不同(但相似)含义的中缀整数运算符的实现。