チュートリアル
Python で 2 つのリストを比較する方法
著者 songshiqiang7分で読めます
Python では 2 つのリストを比較して差分・共通要素・一意要素を見つけることがよくあります。ここでは、目的に応じて使い分けられる実用的な方法を順に解説します。
1. set を使う(最速・最簡潔)
順序や重複を気にしない場合に最適です。
list_a = [1, 2, 3, 4, 5]
list_b = [4, 5, 6, 7, 8]
set_a = set(list_a)
set_b = set(list_b)
common = set_a & set_b # 交差
only_a = set_a - set_b # A のみ
only_b = set_b - set_a # B のみ
symm = set_a ^ set_b # 対称差
長所: 大規模データでも高速・簡潔。短所: 順序と重複は失われます。
2. リスト内包表記(順序・重複を保持)
list_a = [1, 2, 3, 4, 5, 5]
list_b = [4, 5, 6, 7, 8]
only_a = [x for x in list_a if x not in list_b] # [1, 2, 3]
common = [x for x in list_a if x in list_b] # [4, 5, 5]
性能向上: list_b を先に set にしてから in を使うと高速です。
set_b = set(list_b)
common = [x for x in list_a if x in set_b]
3. for ループ(初心者にやさしい)
only_a = []
for x in list_a:
if x not in list_b:
only_a.append(x)
4. collections.Counter(出現回数で比較)
from collections import Counter
ca = Counter(['a', 'b', 'b', 'c'])
cb = Counter(['b', 'c', 'd', 'e'])
common = list((ca & cb).elements()) # ['b', 'c']
only_a = list((ca - cb).elements()) # ['a', 'b']
長所: 頻度の比較が簡単。短所: 元の順序は保持されません。
まとめ
| 方法 | 長所 | 短所 | 向いている用途 |
|---|---|---|---|
| set | 最速・簡潔 | 順序/重複なし | 交差・差集合・対称差 |
| リスト内包 | 順序/重複を保持 | 大規模で遅い(set 併用推奨) | 条件付き抽出、順序保持 |
| for ループ | 拡張しやすい | 冗長 | 初心者/複雑な条件 |
| Counter | 頻度比較が容易 | 順序なし | 出現回数の差を比較 |
メンバーシップ確認だけなら、対象側を set にしてから判定すると高速です。
タグ
#Python#リスト比較#チュートリアル