HOWTO · Python

Python でリストをセットに変換する

Python でリストをセットに変換する方法を示します。

このページの内容

リストをセットに変換するには、Python 組み込みの set() コンストラクターに渡します。たとえば set(my_list) のように呼び出します。

変換後のセットには、ハッシュ可能な異なる値がそれぞれ1つずつ含まれます。リストは要素の位置と重複を保持しますが、セットは変更可能で、重複のないハッシュ可能な要素を格納し、反復順序は保証しません。位置や重複よりも、一意性やメンバーシップ確認が重要な場合にセットを使います。

リストをセットに変換するとデータが変わる理由

["tea", "coffee", "tea"] のようなリストには、定まった順序で3つの要素が記録されています。これをセットに変換すると異なる値は残りますが、重複した "tea" とリスト内の位置情報は失われます。各値がハッシュ可能であれば、セットには文字列、数値、ハッシュ可能な値だけを含むタプルなど、異なる型の値を一緒に格納できます。セット自体は変更できますが、その要素はハッシュ可能でなければなりません。そのため、リストや辞書はセットの要素にできません。

set() でリストをセットに変換する

set(iterable) を呼び出すと、リストやタプルなどの反復可能オブジェクトからセットを作成できます。たとえば、重複のない入力 [1, 2, 3] を変換すると、3つの値がすべて残ります。[1, "two", (3, 4)] のような異なる型を含むリストも有効です。整数、文字列、ハッシュ可能な値だけを含むタプルは、セット内に一緒に格納できるためです。次の例では両方の入力を変換し、混在する値のメンバーシップを確認して、表示順に依存しないようにしています。

このセクションのコードと表示されるラベルや出力は英語のままです。

unique_values = [1, 2, 3]
unique_set = set(unique_values)
assert unique_set == {1, 2, 3}

mixed_values = [1, "two", (3, 4)]
mixed_set = set(mixed_values)
assert len(mixed_set) == 3
assert 1 in mixed_set and "two" in mixed_set and (3, 4) in mixed_set

アサーションでは、反復順序に依存せずセットの内容を確認します。

次の例では、入力値の重複が異なる値の個数にどう影響するかを確認します。コード例とその中の表示ラベルや出力は英語のままです。

この例を実行してみましょう。

values = [3, 1, 3, 2]
converted = set(values)
print(len(converted))
3

変換後は各値が1つずつ残るため、セットの長さは入力に含まれる異なる値の数になります。この個数は一定ですが、セットを表示したときの値の順序は異なる場合があります。引数を指定せずに set() を呼び出すと、空のセットが作成されます。

重複、順序、ハッシュ不可能な要素を扱う

変換すると、重複する値は1つにまとまります。セットの反復順序を前提にせず、インデックス指定やスライスも使わないでください。値の一意性を保ちながら初めて現れた順序も維持したい場合は、リストを使い続けて、別途、確認済みの値を記録します。または、データに合った順序保持の方法を選びます。

set() に渡すすべての要素はハッシュ可能でなければなりません。たとえば、別のリストを含むリストは、内側のリストがハッシュ不可能なため、そのままでは変換できず、Python は TypeError を発生させます。内側の値がレコードを表す場合は、何を一意性の基準にするかを決め、そのハッシュ可能なキー、または適切な不変表現からセットを作成します。タプルを使えるのは、含まれる値がすべてハッシュ可能な場合に限られます。

リストをセットに変換するのが適切な場合

重複が不要で、順序を問わず、すべての値がハッシュ可能な場合はセットに変換できます。タグの重複を取り除いたり、異なる選択肢の中に特定の値があるか確認したりするのに便利です。後続のコードが順序、重複した要素、または各値に対応する位置に依存する場合は、元のリストを保持してください。list(my_set) でリストに戻すことはできますが、セットへの変換時に失われた重複や元の順序は復元できません。