我有一组来自两个不同目录的文件名。
currList=set(['pathA/file1', 'pathA/file2', 'pathB/file3', etc.])
我的代码正在处理文件,需要更改currList 通过将它与前一次迭代的内容进行比较,比如processLst。 为此,我计算了一个对称差异:
toProcess=set(currList).symmetric_difference(set(processList))
实际上,我需要symmetric_difference才能对basename(file1 ...)进行操作 在完整的文件名(pathA / file1)。
我想我需要重新实现__eq__
运算符,但我不知道如何在python中执行此操作。
__eq__
正确的做法?
或答案 0 :(得分:2)
这是一个令牌(可能构造得很差)itertools
版本,如果速度变得令人担忧,它应该运行得更快一点(虽然同意@ Zarkonnen的单线程非常好,所以+1在那里: ))。
from itertools import ifilter
currList = set(['pathA/file1', 'pathA/file2', 'pathB/file3'])
processList=set(['pathA/file1', 'pathA/file9', 'pathA/file3'])
# This can also be a lambda inside the map functions - the speed stays the same
def FileName(f):
return f.split('/')[-1]
# diff will be a set of filenames with no path that will be checked during
# the ifilter process
curr = map(FileName, list(currList))
process = map(FileName, list(processList))
diff = set(curr).symmetric_difference(set(process))
# This filters out any elements from the symmetric difference of the two sets
# where the filename is not in the diff set
results = set(ifilter(lambda x: x.split('/')[-1] in diff,
currList.symmetric_difference(processList)))
答案 1 :(得分:1)
你可以用生成器表达式的魔力来做到这一点。
def basename(x):
return x.split("/")[-1]
result = set(x for x in set(currList).union(set(processList)) if (basename(x) in [basename(y) for y in currList]) != (basename(x) in [basename(y) for y in processList]))
应该做的伎俩。它为您提供了出现在一个列表或另一个列表中的所有元素X,并且它们在两个列表中的基本名称存在不同。
编辑: 通过以下方式运行:
currList=set(['pathA/file1', 'pathA/file2', 'pathB/file3'])
processList=set(['pathA/file1', 'pathA/file9', 'pathA/file3'])
返回:
set(['pathA/file2', 'pathA/file9'])
这似乎是正确的。