2016-10-07 2 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 имен файлов без расширения, которые соответствуют данному суффиксу. Тогда вы можете легко проверить, файлы с суффиксом .abc является подмножеством файлов с суффиксом .xyz:

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 

выше подход был бы более эффективным, а так как он имеет O (N) временную сложность, где, как оригинал O (n^2). Конечно, если список небольшой, это не имеет большого значения.

+0

Вы можете повысить эффективность даже при использовании наборов, которые быстрее проверяют членство, проверяя линейный поиск по списку. – martineau

+0

@martineau В приведенном выше примере используются наборы. Конечно, вы могли бы преобразовать все «имена файлов» в 'set' и делать то же самое, что и в вопросе. Это все равно будет ** O (n) **, хотя на практике это может быть более эффективным. – niemmi

+0

Извините, моя ошибка. Ваше заявление о сложности времени отбросило меня. Это лучше, чем ** O (n) **, это (почти) ** O (1) ** - см. [_Время сложности операций набора python? _] (Http://stackoverflow.com/questions/7351459/time -complexity-of-python-set-operations) – martineau

Смежные вопросы