[python]リスト同士で順序を保持して差集合を求める

一旦集合型にする

差集合を求めるだけなら一旦集合型に型変換して差集合を求めて再度リスト型にすれば出来ます。
しかし、こうすると順番がバラバラになってしまうので用途によっては困ります。
#和集合
print(list(set(['a','b'])|set(['b','c']))) #['c', 'a', 'b']

#積集合
print(list(set(['a','b','c'])&set(['b','c','d']))) #['c', 'b']

#差集合
print(list(set(['a','b','c'])-set(['c']))) #['b', 'a']

#対称差集合
print(list(set(['a','b'])^set(['b','c']))) #['c', 'a']
結果のリストは毎回順番が異なります。

内包表記による和集合・積集合・差集合・対称差集合

条件付きの内包表記を使うと順番を保持して和集合・積集合・差集合・対称差集合を求めることが出来ます。
#それぞれのリストの要素は重複してないとする。
list_1=['a','b','c','d','e']
list_2=['b','d','f','g']

#内包表記による和集合
print(list_1+[i for i in list_2 if i not in list_1 ]) #['a', 'b', 'c', 'd', 'e', 'f', 'g']

#内包表記による積集合
print([i for i in list_1 if i in list_2 ]) #['b', 'd']

#内包表記による差集合
print([i for i in list_1 if i not in list_2 ]) #['a', 'c', 'e']

#内包表記による対称差集合
print([i for i in list_1 if i not in list_2]+[i for i in list_2 if i not in list_1]) #['a', 'c', 'e', 'f', 'g']

filter関数による和集合・積集合・差集合・対称差集合

購入関数であるfileter関数で抽出をして順番を保持した和集合・積集合・差集合・対称差集合を求めることも出来ます。
#それぞれのリストの要素は重複してないとする。
list_1=['a','b','c','d','e']
list_2=['b','d','f','g']

#filetにより抽出して和集合を作る
print(list_1+list(filter(lambda n:n not in list_1, list_2))) #['a', 'b', 'c', 'd', 'e', 'f', 'g']

#filetにより抽出して積集合を作る
print(list(filter(lambda n:n in list_2, list_1))) #['b', 'd']

#filetにより抽出して差集合を作る
print(list(filter(lambda n:n not in list_2, list_1))) #['a', 'c', 'e']

#filetにより抽出して対称差集合を作る
print(list(filter(lambda n:n not in list_2, list_1))+list(filter(lambda n:n not in list_1, list_2))) #['a', 'c', 'e', 'f', 'g']

ページ情報
タイトル
[python]リスト同士で順序を保持して差集合を求める
URL
https://www.nomuramath.com/yatrujbw/
SNSボタン