Pythonにはさまざまなデータ構造が用意されており、その中でも頻繁に使用されるものに「リスト(list
)」と「セット(set
)」があります。
リストとは?
リストは、順序付けられた要素のコレクションです。リストの各要素にはインデックスが割り当てられており、そのインデックスを使って要素にアクセスできます。
リストの特徴:
- 順序を保持: リストは要素の挿入順序を保持します。
- 重複を許可: リストは同じ値の要素を複数回持つことができます。
- インデックスによるアクセス: リストの要素にはインデックスを使ってアクセスできます。
- ミュータブル: リストは変更可能であり、要素を追加、削除、変更ができます。
my_list = [1, 2, 3, 4, 5]
print(my_list[2]) # 3 (インデックス2の要素にアクセス)
my_list.append(6) # 要素を追加
print(my_list) # [1, 2, 3, 4, 5, 6]
セットとは?
セットは、順序がなく、重複しない要素のコレクションです。セットは数学の集合のように、重複する要素を自動的に排除します。要素に順序がないため、インデックスによるアクセスはできません。
セットの特徴:
- 順序がない: セット内の要素には順序がありません。
- 重複を許可しない: セットには同じ値を複数回含めることはできません。
- インデックスがない: インデックスを使ったアクセスはできません。
- ミュータブル: セットは変更可能であり、要素を追加、削除できます。
- 集合演算が可能: 和集合、積集合、差集合などの集合演算がサポートされています。
my_set = {1, 2, 3, 4, 5}
my_set.add(6) # 要素を追加
print(my_set) # {1, 2, 3, 4, 5, 6}
# 重複する要素は無視される
my_set.add(3)
print(my_set) # {1, 2, 3, 4, 5, 6} (3は追加されない)
リストとセットの違い
特徴 | リスト (list) | セット (set) |
---|---|---|
順序 | 順序を保持 | 順序を保持しない |
重複の許可 | 重複した要素を持つことができる | 重複した要素は持てない |
インデックス | インデックスを使ってアクセスできる | インデックスを持たない |
ミュータブル | 変更可能 | 変更可能 |
速度 | リストの探索時間はO(n) | セットの要素検索はO(1)の平均時間 |
集合演算 | サポートされていない | 和集合、積集合、差集合などが可能 |
リストとセットの使い分け
リストが適している場合
- 順序が重要な場合: データの順序を保つ必要がある場合、リストが適しています。
- 重複を許容する場合: 重複するデータをそのまま扱いたい場合、リストを選びます。
- インデックスでアクセスしたい場合: インデックスで直接要素にアクセスしたい場合はリストが便利です。
セットが適している場合
- 重複を排除したい場合: 重複するデータを自動的に排除したい場合はセットが便利です。
- 高速な要素検索が必要な場合: データが多く、頻繁に存在確認や検索を行う場合はセットが効率的です。
- 集合演算を使いたい場合: データ間の和集合、積集合、差集合を処理する必要がある場合、セットが強力です。
例
- 重複要素の違い
# リストでは重複が許可される
my_list = [1, 2, 2, 3]
print(my_list) # [1, 2, 2, 3]
# セットでは重複が排除される
my_set = {1, 2, 2, 3}
print(my_set) # {1, 2, 3}
- アクセスの違い
# リストはインデックスでアクセス可能
my_list = [1, 2, 3]
print(my_list[1]) # 2
# セットはインデックスでアクセスできない
my_set = {1, 2, 3}
# print(my_set[1]) # エラーになる
- 検索と速度
# リストでの要素検索
my_list = [1, 2, 3, 4, 5]
print(3 in my_list) # True (O(n))
# セットでの要素検索
my_set = {1, 2, 3, 4, 5}
print(3 in my_set) # True (O(1))
- 集合演算
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 和集合
print(set1.union(set2)) # {1, 2, 3, 4, 5}
# 積集合
print(set1.intersection(set2)) # {3}
# 差集合
print(set1.difference(set2)) # {1, 2}
参考