2016-10-07 23 views
0

、例えば:チェック並列処理

mydir/ 
    test1.abc 
    set123.abc 
    jaja98.abc 
    test1.xyz 
    set123.xyz 
    jaja98.xyz 

私はすべての.abcファイルに対して同等.xyzファイルがあることを確認する必要があります。このような何かが失敗するだろうが

>>> filenames = ['test1.abc', 'set123.abc', 'jaja98.abc', 'test1.xyz', 'set123.xyz', 'jaja98.xyz'] 
>>> suffixes = ('.abc', '.xyz') 
>>> assert all(os.path.splitext(_filename)[0]+suffixes[1] in filenames for _filename in filenames if _filename.endswith(suffixes[0])) 

上記のコードは、アサーションを渡す必要があります:私はこのようにそれを行うことができ

>>> filenames = ['test1.abc', 'set123.abc', 'jaja98.abc', 'test1.xyz', 'set123.xyz'] 
>>> suffixes = ('.abc', '.xyz')                     >>> assert all(os.path.splitext(_filename)[0]+suffixes[1] in filenames for _filename in filenames if _filename.endswith(suffixes[0])) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AssertionError 

しかし、それは少しも冗長です。
同じチェックを行う方が良いですか?

答えて

2

setのファイル名を、指定された接尾辞に一致する拡張子なしに返すヘルパー関数を定義できます。オリジナルとしてある場合、それはO(n)の時間の複雑さを持っているので、アプローチの上

filenames = ['test1.abc', 'set123.abc', 'jaja98.abc', 'test1.xyz', 'set123.xyz', 'jaja98.xyz'] 
filenames2 = ['test1.abc', 'set123.abc', 'jaja98.abc', 'test1.xyz', 'set123.xyz'] 
suffixes = ('.abc', '.xyz') 

def filter_ext(names, ext): 
    return {n[:-len(ext)] for n in names if n.endswith(ext)} 

assert filter_ext(filenames, suffixes[0]) <= filter_ext(filenames, suffixes[1]) 
assert filter_ext(filenames2, suffixes[0]) <= filter_ext(filenames2, suffixes[1]) # fail 

は同様に、より効率的に次のようになります。そして、あなたは簡単にチェックできる接尾.abcのファイルが接尾.xyzとファイルのサブセットでありますO(n^2)。もちろんリストが小さければ、これは本当に重要ではありません。

+0

リストを使ったリニア検索よりも速いメンバーシップチェックを行うセットを使うと、効率をさらに向上させることができます。 – martineau

+0

@martineau上記の例では、セットを使用しています。もちろん、 'ファイル名'全体を 'set'に変換して、問題と同じことをすることができます。実際にはもっと効率的かもしれませんが、それはまだ** O(n)**です。 – niemmi

+0

申し訳ありませんが、私の間違いです。時間の複雑さに関するあなたの声明は私を捨てました。それは** O(n)**よりも優れています**(ほぼ)** O(1)** - [_Time複雑なPythonセット操作?_](http://stackoverflow.com/questions/7351459/time -complexity-of-python-set-operations) – martineau