Учитывая каталог файлов и т.д .:Проверить параллельность файлов с использованием их суффиксов
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
Но это слишком громоздким.
Есть ли возможность делать одни и те же проверки?
Вы можете повысить эффективность даже при использовании наборов, которые быстрее проверяют членство, проверяя линейный поиск по списку. – martineau
@martineau В приведенном выше примере используются наборы. Конечно, вы могли бы преобразовать все «имена файлов» в 'set' и делать то же самое, что и в вопросе. Это все равно будет ** O (n) **, хотя на практике это может быть более эффективным. – niemmi
Извините, моя ошибка. Ваше заявление о сложности времени отбросило меня. Это лучше, чем ** O (n) **, это (почти) ** O (1) ** - см. [_Время сложности операций набора python? _] (Http://stackoverflow.com/questions/7351459/time -complexity-of-python-set-operations) – martineau