私は The Quick Python Book を使用して Python 3 を学んでいます。著者はfrozensets について話し、set は変更可能でハッシュできないため、辞書のキーには適さないため、凍結された対応するものが導入されたと述べています。タプルは順序付けられたデータ構造であり、フローズンセット、またはより一般的にはセットは順序付けられていないという明らかな違い以外に、タプルとフローズンセットの間に他の違いはありますか?
4 に答える
tuples
不変ですlists
、frozensets
不変sets
です。
tuples
確かにオブジェクトの順序付けられたコレクションですが、重複やハッシュ不可能なオブジェクトを含むことができ、スライス機能があります
frozensets
はインデックス化されていませんが、sets
O(1) 要素のルックアップ、およびユニオンや交差などの機能があります。また、変更可能な対応物のように、重複を含めることもできません。
やや直感に反する - このボンのモットーはどうですか:
sss = frozenset('abc')
sss |= set('efg')
生成されます:
frozenset(['a', 'c', 'b', 'e', 'g', 'f'])
もちろん、これは x = x | と同等です。y、元のfrozensetを変更するわけではありませんが、コードレビュー担当者にとって「不変」という用語を半分嘲笑することにはなりません!
頭に浮かぶ違いの 1 つは、重複の問題です。のタプルは(1, 1, 1, 1, 2, 2, 2)
まさにあなたが期待するものですが、frozenset はそれらの重複をすべて削除し、frozenset([1, 2])
.
Volatility は、frozensets がインデックス化されていないことを述べています。私は他の機能を見ていたので、標準の python スライスが不可能であることにすぐには気付きませんでした。
a = frozenset((1, 1, 1, 1, 2, 2, 2)) # results in frozenset([1, 2])
print a[0]
エラーが発生します:
TypeError: 'frozenset' object does not support indexing
インデックス化されていないという事実から明らかですが、ここに明示的に追加する価値はありました