Почему условие IF все время оценивается как True - PullRequest
3 голосов
/ 09 мая 2020

Почему оператор if каждый раз оценивается как True, даже если я намеренно даю предвзятые входные данные в свой код. Вот мой код:

s1 = 'efgh'
s2 = 'abcd'

for i in range(0, len(s1)):
    for j in range(1, len(s1)+1):
        if s1[i:j] in s2:
            print('YES')

Он печатает YES 6 раз. Почему?

Ответы [ 3 ]

4 голосов
/ 09 мая 2020

Если у вас есть i >= j, вы получите пустую строку для s1[i:j]. Пустая строка всегда возвращает True при проверке in другой строки, следовательно, ваши операторы печати. ​​

Вместо этого вы должны начинать j как i + 1:

s1 = 'efgh'
s2 = 'abcd'

for i in range(0,len(s1)):
    for j in range(i + 1,len(s1)+1):
        if s1[i:j] in s2:
            print('YES')

Что дает нет вывода.


Пустые строки всегда считаются подстрокой любой другой строки, поэтому "" в "ab c" вернет True.

Источник документов

2 голосов
/ 09 мая 2020

Потому что некоторые комбинации создают пустую строку:

s1 = 'efgh'
s2 = 'abcd'

for i in range(0, len(s1)):
    for j in range(1, len(s1) + 1):
        if s1[i:j] in s2:
            print('YES', i, j, repr(s1[i:j]))

Вывод:

YES 1 1 ''
YES 2 1 ''
YES 2 2 ''
YES 3 1 ''
YES 3 2 ''
YES 3 3 ''

Также может быть полезно просмотреть все случаи - бывает много случаев, когда условие if не проходит:

s1 = 'efgh'
s2 = 'abcd'

for i in range(0, len(s1)):
    for j in range(1, len(s1) + 1):
        print(s1[i:j] in s2, i, j, repr(s1[i:j]))

Вывод:

False 0 1 'e'
False 0 2 'ef'
False 0 3 'efg'
False 0 4 'efgh'
True 1 1 ''
False 1 2 'f'
False 1 3 'fg'
False 1 4 'fgh'
True 2 1 ''
True 2 2 ''
False 2 3 'g'
False 2 4 'gh'
True 3 1 ''
True 3 2 ''
True 3 3 ''
False 3 4 'h'
0 голосов
/ 09 мая 2020

Условие IF не всегда оценивается как True. Это происходит потому, что в некоторых ваших циклах i >= j. И когда это произойдет, s1[i:j] вернет пустую строку как "".

В вашем if condition вы проверяете, содержится ли s1[i:j] в s2. В соответствии с приведенным выше сценарием вы будете проверять, содержится ли s1[i:j] (пустая строка) в s2.

По умолчанию каждая строка содержит пустую строку. Это похоже на проверку следующего:

if '' in s2: # this is always true

Согласно вашему коду s1 не содержит никаких символов, что также содержится в s2. Следовательно, это произойдет только тогда, когда i >= j.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...