Как узнать, есть ли в строке повторяющиеся символы?
Я написал этот код... и ожидаемый ответ неверен в этом коде, если строка содержит повторяющиеся символы, она должна возвращать False, но во всех случаях она возвращает True
Я сделал так много кода, чтобы попытаться решить эту проблему Это в блокноте JUPYTER
def is_isogram(string):
for i in string:
if string.count(i) == 1:
print('True')
elif string.count(i) > 1:
print('False')
Я набрал 'Hello', он должен вернуть False, но вернул true во всех случаях
4 ответа
Вы печатаете True
а также False
для каждого символа в строке. Выполнение вашего кода с вводом "hello" даст 5 строк вывода, два True
, два False
и еще один True
,
def is_isogram(string):
for i in string:
if string.count(i) > 1:
return False
return True
Этот код вернет либо True, либо False. Если какой-либо символ в строке появляется более одного раза, функция возвращает False и завершает работу. Если ни один из символов не появляется более одного раза, он возвращает True после выхода из цикла.
Пояснение к коду
Вы можете быть уверены, что слово не является изограммой, если любая буква встречается более одного раза, т. Е. Вам не нужно проходить всю строку, пока вы не найдете повторяющийся символ. Но чтобы убедиться, что у вас есть изограмма, вам нужно проверить всю строку.
for i in string:
Это утверждение повторяет цикл символ за символом.
if string.count(i) > 1:
return False
Оператор if проверяет, присутствует ли текущий символ i в строке более одного раза. Если это так, функция возвращает False
, Если нет, он переходит к следующей итерации.
return True
Если элемент управления достиг этого утверждения, это означает, что ни один из символов не появляется дважды, поскольку функция вернула бы False
до достижения этого утверждения. Итак, функция возвращает True
Рассмотрим вход "hello"
,
Итерация 1: i = 'h'
а также string.count('h') = 1
Итак, ничего не делать
Итерация 2: i = 'e'
а также string.count('e') = 1
Итак, ничего не делать
Итерация 3: i = 'l'
а также string.count('l') = 2
Итак, вернемся False
,
Если вы вызвали функцию, как, print(is_isogram("hello"))
, False
будет напечатан.
Рассмотрим другой вклад "abcd"
Итерация 1: i = 'a'
а также string.count('a') = 1
Итак, ничего не делать
Итерация 2: i = 'b'
а также string.count('b') = 1
Итак, ничего не делать
Итерация 3: i = 'c'
а также string.count('c') = 1
Итак, ничего не делать
Итерация 4: i = 'd'
а также string.count('d') = 1
Итак, ничего не делать
На этом этапе цикл исчерпан и return True
заявление выполнено
Вы можете быть уверены, что ваше слово не является изограммой, как только вы найдете число, превышающее единицу, но вы можете быть уверены, что оно является одним после того, как вы проверили все буквы:
def is_isogram(string):
for i in string:
if string.count(i) > 1:
return False
return True
print(is_isogram('pear'))
# True
print(is_isogram('apple'))
# False
Или, если вы действительно хотите, чтобы ваша функция печатала вывод, а не возвращал его, что я бы вообще не рекомендовал:
def is_isogram(string):
for i in string:
if string.count(i) > 1:
print('False')
return
print('True')
Короче, классическим решением было бы сделать set
символов и проверить, равно ли количество уникальных символов длине строки
def is_isogram2(string):
return len(set(string)) == len(string)
Это простой фрагмент, который вы можете использовать, чтобы проверить, есть ли в строке повторяющиеся символы. Переберите все символы и убедитесь, что они уже были.
def is_isogram(s):
mp = {}
for c in s:
if c in mp.keys():
return False
mp[c] = 1
return True
Не очень питонно, но в вашем оригинальном стиле:
def is_isogram(s):
for i in s:
if s.count(i) > 1:
return False
return True