問題の歴史:
集合(set)はPython 2.4から独自の組み込み型として導入されました(それ以前はサードパーティモジュールとして実装されていました)。それはユニークで順序付けられていない要素を効率的に保存でき、集合の理論に基づく多くの標準操作、すなわち和、交差、差、対称差、および部分集合のチェックをサポートします。
問題:
setがない場合、リストを使用しなければならず、これによりユニークな要素の検索が非効率的になり、多くの存在確認が必要なアルゴリズムが遅くなります。setはハッシュテーブルを通じて実装されているため、すべての検索、追加、削除操作は平均してO(1)の時間で実行されます。しかし、この構造は予期しない問題を引き起こす可能性があります。例えば、要素の順序の喪失、要素の型に関する制限(不変でハッシュ可能である必要がある)や、集合の比較および他の構造との相互作用の理解不足などです。
解決策:
ユニークな要素のみを保存し、それらに集合の理論に基づく操作を実行する必要がある場合はsetを使用します。要素はハッシュ可能でなければなりません(例えば、数値、文字列、タプルなど。リストやdictではありません)。setを扱うために、豊富なビルトインメソッド(add、remove、union、intersection、difference、issubsetなど)が提供されています。
コード例:
s1 = {1, 2, 3, 4} s2 = {3, 4, 5} print(s1 | s2) # {1, 2, 3, 4, 5} (和) print(s1 & s2) # {3, 4} (交差) print(s1 - s2) # {1, 2} (差) print(3 in s1) # True (存在確認)
主要な特徴:
変更可能な型(例えば、リスト)をsetに追加できますか?
いいえ、集合の要素はハッシュ可能で不変である必要があります。リストやdictをsetに追加することはできず、PythonはTypeErrorを発生させます。
s = set() s.add([1, 2, 3]) # TypeError: unhashable type: 'list'
setは要素の順序を保持しますか?
いいえ。setが作成された時点から、要素が追加された順序で返されることは保証されません。特に集合のサイズが変更されると、その順序が保証されなくなります。
s = {5, 2, 8, 1} print(s) # 順序は不定
setとfrozensetの違いは何ですか。また、frozensetをsetの要素として使用できますか?
frozensetはsetの不変版です。ハッシュ可能なので、別のsetの要素やdictのキーとして使用できます。
fs = frozenset([1, 2, 3]) s = set() s.add(fs) # OK
開発者はユニークな要素を保存したいと考え、setを選びましたが、その出現順序を考慮しませんでした。その結果、処理順序に依存するビジネスロジックの一部が機能しなくなりました。
長所:
短所:
大きなデータセットからユニークなエントリを迅速にフィルタリングするタスクでは、重要なのはユニーク性のみであり、順序ではなかったため、setが選ばれました。パフォーマンスは大幅に向上し、コードは簡素化されました。
長所:
短所: