重新实现__eq__以在python中比较集与symmetric_difference

时间:2012-10-09 08:28:31

标签: python set

我有一组来自两个不同目录的文件名。

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中执行此操作。

  1. 正在重新实施__eq__正确的做法? 或
  2. 还有另一种更好/等效的方法吗?

2 个答案:

答案 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'])

这似乎是正确的。