2016-11-19 183 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