2016-11-19 143 views
2

Dictionary views“是类似集合的对象”,因此可用于比较字典内容与其他对象。具体而言,比较列表与词典

  • 键的视图:设置状
  • 值的视图:未设置状
  • 项目的视图:集一样,如果(键,值)对是独特且可排序

键盘视图的类似于集合的特性允许按位比较。在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'} 

list而和set对象通常不能这种方式进行比较。

['#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' 
被设置样

除此之外,为什么关键的观点进行比较,使用按位运算符列表?


测试上:| Python的3.5.2 |的Python 3.4.4 | Python的2.7.12(使用viewkeys())| IPython的5.0.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 

我不知道这种遗漏的原因,但我怀疑它可能是“没人会写”,因为你可以明确地使用set.intersection