背景:
型set(集合)はPython 2.4に追加され、理論的集合操作(和、交差など)をサポートした、ユニークな変更不可能な要素を保存する便利で高速な方法を提供します。集合はハッシュテーブルを基盤として実装されています。
問題: 多くのユーザーはsetとlistの違いや、setにおける要素の格納の特徴(順序がない、ハッシュ可能なオブジェクトのみなど)、および大規模データセットのユニーク性の確認や検索の最適化のための集合の使用に関するニュアンスを理解していません。
解決策:
Setは変更可能で順序がないユニークなハッシュ可能なオブジェクトのコンテナです。メンバーシップ、和、交差、差、および対称差を検索するための高速な操作をサポートしています。組み込みメソッド:add、remove、discard、update、intersection、difference、union、symmetric_differenceなど。
コード例:
nums = {1, 3, 5, 7} nums.add(9) nums.update([5, 10]) # 5はすでに存在するので10のみが追加される other = {3, 9, 11} inter = nums & other # 交差 {3, 9} # メンバーシップテスト - listよりも早い y = 11 if y in nums: print('存在する!')
主な特徴:
in操作は驚くほど速い(平均O(1))、リスト(O(n))とは異なります。リストや他のsetをsetに追加できますか?
回答:いいえ、できません。ハッシュ可能な(不変の)オブジェクトのみが許可されます:文字列、数値、タプル。リストやセットは変更可能なので追加できません。
コード例:
s = set() s.add([1, 2]) # TypeError: unhashable type: 'list' s.add((1, 2)) # OK
setのremoveメソッドはdiscardメソッドと何が違いますか?
回答:remove(value)はvalueが見つからない場合にKeyErrorを発生させます。discard(value)はそのような要素がない場合には静かに何もしません。
コード例:
s = {1, 2, 3} s.remove(4) # KeyError s.discard(4) # エラーなし
空の集合{}はsetオブジェクトですか?
回答:いいえ。リテラル{}は常に空のdictです。空のsetを作成するには、set()関数を使用する必要があります。
コード例:
empty_set = {} # これはdict empty_set_real = set() # これはset
ネガティブケース
ユニークなオブジェクトをリストに保存し、大規模なデータセットで重複を探すために「in」を使用します。
利点:
欠点:
ポジティブケース
大きな配列(例えば、メール配信)での交差とユニークなデータの確認にsetを使用し、重複が発生せず操作が迅速に行われます。
利点:
欠点: