pythonで集合の問題を考えるときにちょっと研究してみた。
比較対象はファイルリスト。robocopyしたやつが何かが足りない。足りないファイルを探すための関数だ。
@stop_watch
def symmetry_difference_python(lst1,lst2):
return set(lst1) ^ set(lst2)
print("^symmetric_difference()",len(symmetry_difference_python(ListA,ListB)))
@stop_watch
def symmetry_difference_list(lst1,lst2):
p =lst1.copy()
q =lst2.copy()
for element in lst1:
try:
q.remove(element)#相手方に同じ要素があるなら
p.remove(element)#自分の要素も削除
except ValueError:
pass
return [p,q]
###
## try に頼らない対称差関数を作ってみる。
#
@stop_watch
def symmetry_difference_list1(lst1,lst2):
p =lst1.copy()
q =lst2.copy()
for element in lst1:
if ((element in p) and (element in q)):
p.remove(element)
q.remove(element)
return [p,q]
test1=symmetry_difference_list1(ListA,ListB)
print("symmetry_difference_list1",len(test1[0]),len(test1[1]))
test1=symmetry_difference_list(ListA,ListB)
print("symmetry_difference_list",len(test1[0]),len(test1[1]))
最速は python 内 symmetric_difference()。
但し問題がある。違う項目を一つのまとまった配列で戻してくれるため、どちらのリストから出た項目かどうか分からない。
このままではどちらのドライブにコピーされていないファイルがあるのか分からないのだ。
a=[a,b,c,d,e] b=[ c,d,e,f,g] result=[a,b, f,g]
s
と言った具合だ。
という分けでとりあえず2種類のコードを作ってみた。
# 対称差(重複の反対)
@stop_watch
def symmetry_difference_list(lst1,lst2):
p =lst1.copy()
q =lst2.copy()
for element in lst1:
try:
q.remove(element)#相手方に同じ要素があるなら
p.remove(element)#自分の要素も削除
except ValueError:
pass
return [p,q]
###
## try に頼らない対称差関数を作ってみる。
#
@stop_watch
def symmetry_difference_list1(lst1,lst2):
p =lst1.copy()
q =lst2.copy()
for element in lst1:
if ((element in p) and (element in q)):
p.remove(element)
q.remove(element)
return [p,q]
test1=symmetry_difference_list1(ListA,ListB)
print("symmetry_difference_list1",len(test1[0]),len(test1[1]))
test1=symmetry_difference_list(ListA,ListB)
print("symmetry_difference_list",len(test1[0]),len(test1[1]))
データ数はp477631 q477893 集合の差のsubtractという関数はコピペである。
symmetric_difference()",len(symmetry_difference_python(ListA,ListB)))
@stop_watch
def subtract_list(lst1, lst2):
lst = lst1.copy()
for element in lst2:
try:
lst.remove(element)
except ValueError:
pass
#else:
# print(len(lst),end='\r')
return lst
print("subtract_list",len(subtract_list(ListA,ListB)))
結果は
| 時間 | ||
| subtract_list | 110 | |
| symmetric_difference() | 0.6 | 秒 |
| tryを使う | 283 | 秒 |
| tryを使わない | 230 | 秒 |
但し、これなら一度symmetric_difference()してその項目をお互いのListから削除するのが速いかもしれない。
