пытаюсь выяснить, почему один и тот же результат, но разные результаты

#python

#python

Вопрос:

 def replace_ending(sentence, old, new):
    # Check if the old string is at the end of the sentence

    # if old in sentence:
    #     i = len(sentence)
    #     N = len(old)
    #     wrong_sentence = sentence[0:i-N]   new
    #     return wrong_sentence

    if old in sentence == True:
        i = len(sentence)
        N = len(old)
        correct_sentence = sentence[0:i-N]   new
        return correct_sentence
    return sentence


print(replace_ending("She sells seashells by the seashore", "seashells", "donuts"))
# # Should display "She sells seashells by the seashore"
 

результат сверху : She sells seashells by thedonuts
результат внизу : She sells seashells by the seashore

Я застрял, пытаясь выяснить, почему оба «if заявления» выдают «True» в качестве выходных данных. Но результаты печати разные. Кто-нибудь знает, что вызывает это?

Комментарии:

1. Попробуйте if sentence.endswith(old):

2. Ах, извините, я запутался. Билл был прав, нижнее утверждение выдает false в результате, когда его спрашивают «если старое в предложении == True», что равно «False». Поэтому он возвращает только предложение.

Ответ №1:

Вы утверждаете, что все три этих выражения будут возвращать одно и то же, что неточно.

 Python 3.8.2 (default, Feb 26 2020, 02:56:10)
> ("a" in "aaa") == True
True
> "a" in "aaa" == True
False
> "a" in "aaa"
True
 

Ответ №2:

Вот объявление о том, с чем вы сталкиваетесь:

 print("seashells" in "She sells seashells by the seashore == True)
False

print("seashells" in "She sells seashells by the seashore)
True

 

В первом: «ракушки» в «Она продает ракушки на берегу моря == True»» == операция выполняет действие перед in операцией, поэтому, если мы спросим "She sells seashells by the seashore == True" результат False , тогда, если мы продолжим спрашивать "seashells" in False , результат будет False

Следовательно:
"seashells" in "She sells seashells by the seashore == True" не то же самое, что "seashells" in "She sells seashells by the seashore == True"

и доказательством является:

 print(  ("seashells" in "She sells seashells by the seashore) == True)
True
 

итак, в вашем коде вы должны использовать:

  if (old in sentence) == True:
 

чтобы получить ожидаемый ответ.

Ответ №3:

Отвечая на ваш первоначальный вопрос:

Я застрял, пытаясь выяснить, почему оба «if заявления» выдают «True» в качестве выходных данных. Но результаты печати разные.

Ответ прост, он связан с:

Приоритет операторов

Выполнение этого:

 if old in sentence == True:
 

Является ли Syntactic_sugar для этого:

 if old in sentence and sentence == True:
 

Итак, что происходит, это проверка отдельно двух операторов.

Следовательно, чтобы иметь правильный приоритет (без использования and), вы должны сделать это:

 if (old in sentence) == True:
 

Так оно и есть:

  1. Есть ли какой-либо символ внутри старого также в предложении ?.
  2. Затем получает логическое значение и спрашивает, равен ли результат True ?

Документация и руководства

Обратите внимание, что сравнения, тесты принадлежности и тесты идентификации имеют одинаковый приоритет и имеют функцию цепочки слева направо, как описано в разделе Сравнения.

Заключительное рассмотрение

Это не то, что вы спрашивали изначально, однако естественно, что выполняемая вами функция кажется логически неправильной (судя по комментариям в ней, имени переменных и т. Д.)

Способ, которым вы запускаете оператор if, проверяет, есть ли в предложении какой-либо символ в Old, если да, то добавьте к нему новое слово (donuts). Так что это, очевидно, правда. Было бы достаточно даже одного символа, чтобы выполнить это утверждение true, например:

 print(replace_ending("She sells seashells by the seashore", "s", "donuts"))
 

Все равно даст вам это, потому что s находится в предложении:

Решение

Представьте это по-другому, используя функцию any или all (я оставил оператор print, чтобы вы видели, что происходит в списке l).

То, что вы делаете до сих пор, совпадает с этим

 def replace_ending(sentence, old, new):

    l = [char in old for char in sentence]
    print(l)
    if any(l):
        i = len(sentence)
        N = len(old)
        correct_sentence = sentence[0:i-N]   new
        return correct_sentence
    return sentence
 

Вы хотите вместо этого (если это то, чего вы хотите достичь) использовать функцию all

 def replace_ending(sentance, old, new):


    N = len(old)
    get_last_word = sentance[-(N-1):] # -> Get seashore
    l = [char in old for char in get_last_word] 
    if all(l):
        i = len(sentance)
        correct_sentence = sentance[0:i-N]   new
        return correct_sentence
    return sentance
 

Это означает, что все символы должны быть в последнем слове предложения.