2016-11-19 13 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'} 

setオブジェクト通常list一方、このように比較することはできません。

['#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 |(viewkeys()を使用して)Pythonの2.7.12 | 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を使うことができるので、それはおそらく "誰もそれを書こうと思っていません"と思われます。

関連する問題