1

2つの異なるディレクトリからのファイル名のセットがあります。

currList=set(['pathA/file1', 'pathA/file2', 'pathB/file3', etc.])

私のコードはファイルを処理しており、以前の反復でのコンテンツ、たとえばprocessLstと比較してcurrListを変更する必要があります。そのために、対称差を計算します。

toProcess=set(currList).symmetric_difference(set(processList))

実際、完全なファイル名(pathA / file1)ではなく、ベース名(file1 ...)を操作するには、symmetric_differenceが必要です。

演算子を再実装する必要があると思い__eq__ますが、Pythonでそれを行う方法がわかりません。

  1. __eq__正しいアプローチを再実装していますか?また
  2. 別のより良い/同等のアプローチはありますか?
4

2 に答える 2

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)))
于 2012-10-09T15:24:48.943 に答える
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]))

トリックを行う必要があります。これにより、いずれかのリストに表示され、2つのリストのbasename-presenceが同じではないすべての要素Xが得られます。

編集: これを実行する:

currList=set(['pathA/file1', 'pathA/file2', 'pathB/file3'])
processList=set(['pathA/file1', 'pathA/file9', 'pathA/file3'])

戻り値:

set(['pathA/file2', 'pathA/file9'])

これは正しいように見えます。

于 2012-10-09T08:53:57.793 に答える