список понимания, если заявление не работает - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь go просмотреть все файлы в каталоге и что-то сделать с файлами с указанными c именами файлов. По какой-то причине оператор if не работает, когда я использую списки, и все итерации кажутся go в операторе if:

for filename in os.listdir(somepath):
    if (str(i_test) in filename for i_test in range(15,20)):
        do something

Оператор if работает, как и ожидалось, если я явно пишу числа в операторе if:

for filename in os.listdir(somepath):
    if '15' in filename or ('16' in filename) or ('17' in filename) or ('18' in filename) or ('19' in filename):
        do something

Я не мог найти, где я ошибся в понимании списка.

Ответы [ 2 ]

5 голосов
/ 28 января 2020

Во-первых, второстепенный вопрос, но это не понимание списка; это выражение генератора. Разница здесь не существенная, но они разные. Понимания списка заключены в [], в то время как выражения генератора используют () (как у вас здесь).

Во-вторых, у вас по существу есть:

if <generator expression>:

Проблема в том, что Само выражение генератора никогда не будет ложным (в отличие от результата понимания списка), поэтому это условие всегда будет истинным.

Вы хотите использовать any, чтобы сказать «если какие-либо тесты» верны ":

if any(str(i_test) in filename for i_test in range(15,20)):
2 голосов
/ 29 января 2020

Вы можете использовать re

import re

to_find = re.compile('|'.join(map(str, range(15,21)))

for filename in os.listdir(somepath):
    if to_find.search(filename):
        #do something
...