それが何であるか
セットをリストに変換するということは、ユニークでハッシュ可能な要素の順序付けられていないコレクションを秩序化されたインデックス可能なシーケンスに変えることを意味します。実際には、セットを取り、同じ要素を含むリストを作成します。
なぜそれが重要なのか
セットは、迅速なメンバーシップテストや重複の削除に最適ですが、インデックスまたはスライスをサポートしていません。リストはそうです。変換することで:
- インデックス、スライス、または要素を並べ替えます
- アイテムを並べ替えるか、特定の順序でそれらをシリアル化します
- リストを必要とするAPIにデータを渡します
それを使用する方法
方法1:リスト()コンストラクターを使用します(最も直接)
内蔵list()Constructorは、セットとFrozensetを含むすべての反復可能を受け入れ、新しいリストを返します。
# 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から
Frozensetは不変のセットです。変換は同一ですlist()。 Frozensetを参照してください。
fs = frozenset({1, 2, 3})
lst = list(fs)
print(lst)
制限とトレードオフ
- 注文:セットは順序付けられていません。セットから得られるリストには、任意の反復順序があります。使用
sorted(s)決定論的な順序が必要な場合。 - 比較可能性:
sorted(s)すべての要素を同等にする必要があります。のような混合タイプ{1, "a"}上昇しますTypeErrorソートされたとき。 - パフォーマンス:変換は、すべての簡単な方法(構築、開梱、ループ)に対して、O(n)の要素の数で線形です。
- ハッシュ性:ハッシュ可能なオブジェクトのみがセットに住むことができます。 (リストなどの)非シェア不可能なアイテムを含める必要がある場合は、セットにできる前に(例えば、タプルに)変換する必要があります。
FAQ
セット→リストは元の注文を保持しますか?
いいえ。セットには保証された注文がありません。特定の注文が必要な場合は、使用してください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)です。チームが最も読みやすいと思うものを選択してください。
リストから複製を削除し、最初に見られる注文を維持するにはどうすればよいですか?
一般的なパターンは、順序付けられたキーのdictを重視してから、リストに戻すことです。
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。
同時に変換してソートできますか?
はい: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]














