Pythonで複数のリストに共通する・しない要素とその個数を取得

Pythonで複数のリスト(配列)から共通する要素・共通しない要素を抽出し、その個数をカウントします。各リストを集合型setに変換し集合演算を行う。

以下の3つのリストを例とします。

l1 = ['a', 'b', 'c']
l2 = ['b', 'c', 'd']
l3 = ['c', 'd', 'e']

ここでは以下の内容について説明します。

複数のリストから共通する要素とその個数を取得 複数のリストから共通しない要素とその個数を取得 複数のリストからユニークな要素とその個数を取得

一つのリストから重複する要素を抽出したい場合は

複数のリストから共通する要素とその個数を取得

共通部分は&演算子で取得できます。

l1_l2_and = set(l1) & set(l2)
print(l1_l2_and)
# {'b', 'c'}

print(type(l1_l2_and))
# <class 'set'>

リストlist型に変換したい場合はlist()を使います。

l1_l2_and_list = list(l1_l2_and)
print(l1_l2_and_list)
# ['b', 'c']

print(type(l1_l2_and_list))
# <class 'list'>

個数はlen()で取得できます。

print(len(l1_l2_and))
# 2

3個以上の場合も同じです。

l1_l2_l3_and = set(l1) & set(l2) & set(l3)
print(l1_l2_l3_and)
# {'c'}

複数のリストから共通しない要素とその個数を取得

対称差集合(二つの集合のどちらか一方にのみ含まれる要素の集合)は^演算子で取得できます。

l1_l2_sym_diff = set(l1) ^ set(l2)
print(l1_l2_sym_diff)
# {'d', 'a'}

上の例と同じく、リスト化したい場合はlist()、個数を取得したい場合はlen()を使います。

print(list(l1_l2_sym_diff))
# ['d', 'a']

print(len(l1_l2_sym_diff))
# 2

元のリストが3個の場合に^演算子を使うと、すべてのリストに共通する要素も含まれる。

l1_l2_l3_sym_diff = set(l1) ^ set(l2) ^ set(l3)
print(l1_l2_l3_sym_diff)
# {'e', 'c', 'a'}

各リストに一つだけ含まれる要素を抽出したい場合は、すべてのリストを連結したリストの要素から個数が1個のものを抽出します。リスト内包表記およびリストから要素の個数を取得するメソッドcount()を使います。

l_all = l1 + l2 + l3
print(l_all)
# ['a', 'b', 'c', 'b', 'c', 'd', 'c', 'd', 'e']

l_all_only = [x for x in l_all if l_all.count(x) == 1]
print(l_all_only)
# ['a', 'e']

なお、この方法だと元のリストが重複する要素を持っていた場合、その要素も除外されます。

l1_duplicate = ['a', 'a', 'b', 'c']

l_duplicate_all = l1_duplicate + l2 + l3
l_duplicate_all_only = [x for x in l_duplicate_all if l_duplicate_all.count(x) == 1]
print(l_duplicate_all_only)
# ['e']

最初に各リストごとに重複した要素を削除してユニークな要素のみのリストにしてから処理すれば、各リストにのみ含まれる要素を抽出できます。

l_unique_all = list(set(l1_duplicate)) + list(set(l2)) + list(set(l3))
print(l_unique_all)
# ['b', 'c', 'a', 'd', 'b', 'c', 'd', 'e', 'c']

l_uniaues_all_only = [x for x in l_unique_all if l_unique_all.count(x) == 1]
print(l_uniaues_all_only)
# ['a', 'e']

複数のリストからユニークな要素とその個数を取得

複数のリストから重複を取り除きユニークな(一意な)要素を抽出したい場合は、リストをすべて足し合わせてから集合set()型に変換します。

l1_l2_or = set(l1 + l2)
print(l1_l2_or)
# {'d', 'b', 'c', 'a'}

print(list(l1_l2_or))
# ['d', 'b', 'c', 'a']

print(len(l1_l2_or))
# 4

3個以上の場合も同じです。

l1_l2_l3_or = set(l1 + l2 + l3)
print(l1_l2_l3_or)
# {'a', 'c', 'b', 'd', 'e'}
Last Updated: 6/26/2019, 10:34:03 PM