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

それは何ですか

セットをリストに変換するということは、一意のハッシュ可能な要素の順序付けされていないコレクションを、順序付けられたインデックス付け可能なシーケンスに変換することを意味します。実際には、セットを取得し、同じ要素を含むリストを作成します。

なぜそれが重要なのか

セットはメンバーシップの高速テストや重複の削除に最適ですが、インデックス付けやスライスはサポートされていません。リストはそうします。変換すると次のことが可能になります。

  • 要素のインデックス付け、スライス、並べ替えを行う
  • 項目を並べ替えたり、特定の順序でシリアル化したりする
  • リストを必要とする API にデータを渡す

使い方

方法 1: list() コンストラクターを使用する (最も直接的)

内蔵されているlist()コンストラクターは、セットやフローズンセットを含む任意の反復可能オブジェクトを受け入れ、新しいリストを返します。

# Set to list
s = {1, 2, 3, 4}
lst = list(s)
print(lst)     # e.g., [1, 2, 3, 4] (order is arbitrary)

方法 2: [*iterable] で解凍する (簡潔)

スター付きアンパックは、反復可能なものを新しいリスト リテラル内の要素に変換します。この一般的な解凍は PEP 448 で規定されています。

s = {1, 2, 3, 4}
lst = [*s]
print(lst)     # e.g., [3, 1, 4, 2]

方法 3: 並べ替えられたリストを作成する

予測可能な順序が必要な場合は、次を使用します。sorted()自然な順序でソートされたリストを返します。要素は相互に比較可能である必要があります。

s = {10, 2, 7, 3}
lst = sorted(s)
print(lst)     # [2, 3, 7, 10]

方法 4: ループして追加する (明示的な制御)

より冗長ですが、変換中に要素を変換する場合に便利です。

s = {1, 2, 3, 4}
lst = []
for x in s:
    lst.append(x * 10)    # example transformation
print(lst)

方法 5: フリーズセットから

Frozenset は不変セットです。変換は以下と同じですlist()。フローズンセットを参照してください。

fs = frozenset({1, 2, 3})
lst = list(fs)
print(lst)

制限とトレードオフ

  • 順序: セットには順序はありません。セットから取得したリストには、任意の反復順序があります。使用sorted(s)決定的な順序が必要な場合。
  • 比較可能性:sorted(s)すべての要素が比較できる必要があります。のような混合タイプ{1, "a"}を上げますTypeError並べ替えると。
  • パフォーマンス: 変換は、すべての直接的なメソッド (構築、アンパック、ループ) において、要素数 O(n) において線形です。
  • ハッシュ可能性: ハッシュ可能なオブジェクトのみがセット内に存在できます。ハッシュ不可能な項目 (リストなど) を含める必要がある場合は、それらをセットに含める前に (タプルなどに) 変換する必要があります。

よくある質問

set → list は元の順序を保持しますか?
いいえ。セットには順序が保証されていません。特定の注文が必要な場合は、を使用してくださいsorted(s)または、独自のキー機能を適用しますsorted(s, key=...)

「TypeError: 'set' オブジェクトは呼び出し可能ではありません。」というメッセージが表示されました。どうしたの?
おそらく組み込みの名前を上書きした可能性がありますset変数を使用して、それを呼び出してみました。新しいシェルを開始するか変数を削除し、変数に名前を付けないようにしますsetまたはlist

set = {1, 2}     # bad: shadows the built-in
set([3, 4])      # TypeError

一番早い方法は何ですか?
単純な変換の場合、list(s)そして[*s]は両方とも簡潔であり、O(n)です。チームが最も読みやすいと判断したものを選択してください。

リストから重複を削除し、最初に見た順序を維持するにはどうすればよいですか?
一般的なパターンは、順序付けられたキーの辞書を使用して重複を排除し、次にリストに変換し直すことです。

data = ["a", "b", "a", "c", "b"]
unique_preserving_order = list(dict.fromkeys(data))  # Python 3.7+
print(unique_preserving_order)  # ['a', 'b', 'c']

クラスメソッドは以下に文書化されています。dict.fromkeys

こちらもお読みください:Python で文字列を Int に変換する方法

変換と並べ替えを同時に行うことはできますか?
はい:sorted(s)リストを返すため、追加のコンストラクターは必要ありません。

クイックリファレンス

# Basic conversion
lst = list(s)

# Unpack into a list literal
lst = [*s]

# Sorted list
lst = sorted(s)

# Frozenset to list
lst = list(fs)

# Transform while converting
lst = [func(x) for x in s]

Related Posts