今回は、Pythonでlist(配列)から重複を削除する方法についてご紹介します。
リストの重複を削除するメリット
リストから重複を削除すると、データの冗長性を減らし、メモリ使用量を抑えられます。
また、同じ要素を何度も処理しなくて済むため、計算効率が向上する場合があります。
用途によっては重複が問題とならないケースもありますが、重複のないクリーンなデータを扱うことで可読性が高まり、保守性も向上します。
Pythonでリストの重複を削除する3つの方法
ここでは主に、以下の3通りのアプローチを紹介します。
- setを使う方法
- dict.fromkeys()を使う方法
- ループと条件判定を使う方法
1. setを使う方法
最もシンプルなやり方は、リストをset(集合)に変換してからリストに戻す方法です。
ただし、setは順序を保持しないため、元の並びが重要な場合は注意が必要です。
1 2 3 4 |
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3] unique_numbers = list(set(numbers)) print(unique_numbers) |
2. dict.fromkeys()を使う方法
Python 3.7以降の辞書は挿入順を保持します。
その性質を利用し、dict.fromkeys()でキーにして重複を削除すると、元のリストの順序を保ったまま重複除去が可能です。
1 2 3 4 |
fruits = ["apple", "banana", "apple", "orange", "banana", "grape"] unique_fruits = list(dict.fromkeys(fruits)) print(unique_fruits) |
[‘apple’, ‘banana’, ‘orange’, ‘grape’]
3. ループと条件判定を使う方法
要素を順番に確認し、まだ追加していない要素だけを新しいリストに加える方法です。
順序を保持したい時に有効ですが、リストが大きくなるほどin演算子による検索のコストが高くなるため、パフォーマンスに注意してください。
1 2 3 4 5 6 7 8 |
items = [10, "hello", 3.14, "hello", 10, 7] unique_items = [] for item in items: if item not in unique_items: unique_items.append(item) print(unique_items) |
[10, ‘hello’, 3.14, 7]
よくあるエラーと対処法
重複を削除する際に直面しやすいエラーの例をいくつか紹介します。
- TypeError: unhashable type: ‘list’
setやdictのキーにできるのは「ハッシュ可能なオブジェクト」に限られます。リストや辞書など変更可能な型は含めることができません。要素にリストが含まれている場合、setやdict.fromkeys()は使えないので、別の方法が必要です。
- パフォーマンスの低下
ループでリストの重複を判定する方法は、要素数が多いと処理が遅くなる可能性があります。高速化したい場合はsetやdictを活用しましょう。
まとめ
Pythonでリストの重複を削除する方法は、目的や元のリストの要件(順序を維持するかどうかなど)によって選び分けるのがポイントです。
setを使う方法、dict.fromkeys()を使う方法、ループでの方法のいずれも、扱うデータの性質とパフォーマンスを考慮して選択してください。
適切な手段を使いこなすことで、コードをより効率的かつ簡潔に保つことができます。