3以上の集合の関数
集合の要素が3以上でないと困る場合があった。
ついでに可変長引数を採用した一般的な形として残しておこう。
入力は引数にコンマでドンドン配列を並べていけばよい。
出力は一致しなかったものが配列群として戻ってくる。
# 可変長引数(長さ不定の引数)
# リストから孤立したデータを求める。XOR
def symmetry_difference_listXOR(*args):
if (len(args) < 2):
return args #2個以下ならそのまま返す。引数が無かったことを考えて、tupleで
TeamCount = len(args) ##総当たり戦
Intersection = set() # 何れか一致した集合
for tmp in range(TeamCount):
for tmpi in range(tmp):
q = set(args[tmp])
p = set(args[tmpi])
[Intersection.add( setin ) for setin in (p&q)]
result = list()
for tmp in args:
aloneList = set(tmp) - Intersection
result.append(aloneList)
return tuple(result)
実際
l1=[*"qwertyasdfgzxcv123"]
l2=[*"uiop@[asdfbnm,.123"]
l3=[*"uiop@[jkl;:]gzxcv123"]
res=symmetry_difference_listXOR()
print(type(res),len(res),res)
#<class 'tuple'> 0 ()
res=symmetry_difference_listXOR(l1)
print(type(res),len(res),res)
#<class 'tuple'> 1 (['q', 'w', 'e', 'r', 't', 'y', 'a', 's', 'd', 'f', 'g', 'z', 'x', 'c', 'v', '1', '2', '3'],)
res=symmetry_difference_listXOR(l1,l2)
print(type(res),len(res),res)
#<class 'tuple'> 2 ({'q', 'e', 't', 'g', 'r', 'z', 'w', 'x', 'y', 'v', 'c'}, {',', '.', 'u', '[', 'o', '@', 'i', 'm', 'n', 'p', 'b'})
res=symmetry_difference_listXOR(l1,l2,l3)
print(type(res),len(res),res)
# <class 'tuple'> 3 ({'q', 'e', 't', 'r', 'w', 'y'}, {',', '.', 'm', 'n', 'b'}, {'l', ':', 'k', ';', ']', 'j'})
純正のpythonなら最速だが
print(set(l1)^set(l2))
# {',', 'g', '[', 'z', 'o', 'm', 'n', 'x', 'b', '.', 'u', 'q', 'e', 't', 'r', '@', 'i', 'w', 'p', 'y', 'v', 'c'}
ANDに関しては純正が最速。
print(set(l1)&set(l2)&set(l3))
# {'2', '1', '3'}
処理時間についてだが、実は少し改良の余地がありそうだ。