Python – Сравните 2 слова и проверьте, являются ли они анаграммой

Вопрос:Я пытаюсь определить функцию, которая принимает 2 строки, сравнить эти две и возвращает True, если они являются анаграммой. Я не хочу импортировать коллекции. Итак, если string1 есть python, а строка 2 - nohtyp, он должен возвращать True. В противном случае, очевидно, верните false. Здесь мой код выглядит так: def check_anagram(str1, str2): if len(str1) != len(str2):

Вопрос:

Я пытаюсь определить функцию, которая принимает 2 строки, сравнить эти две и возвращает True, если они являются анаграммой. Я не хочу импортировать коллекции.

Итак, если string1 есть python, а строка 2 – nohtyp, он должен возвращать True. В противном случае, очевидно, верните false. Здесь мой код выглядит так:

def check_anagram(str1, str2): if len(str1) != len(str2): return False else: for i in range(0, len(str1), 1): if i in range(0, len(str2), 1): return True else: return False

Это хорошо работает для большинства случаев, но когда
str1 – aaaaaaaaaabbbbbbbbbb, а str2 – ababababbbababababab, он возвращает true
и когда str1 xxxyyyxxx, а str2 – yyyxxxyyy, он также возвращает True.

Он должен получить false для этих 2 случаев, но я понятия не имею.
Может ли кто-нибудь помочь мне в этом?

Лучший ответ:

В настоящее время ваш код всегда будет возвращать True.

for i in range(0, len(str1), 1):

это будет итерация по диапазону длины str1, если строка “python”. Цикл for будет иметь эти значения для “i” : 0, 1, 2, 3, 4, 5 Если вы хотите итерации над каждой буквой пишите

for i in str1:

Это сделает значения i: p, y, t, h, o, n

В качестве альтернативы, если вы используете диапазон, вы можете проверить отдельные буквы с помощью str1 [i]. Это выведет следующее: str1 [0] == “p”, str1 [1] == “y” и т.д.

Так как вы делаете то же самое в своем операторе if, он проверяет, равен ли “i” из диапазона (0, 6) i. Первое значение “i” будет равно 0, после этого сначала проверьте, что он передает оператор if, и будет возвращать True, что означает, что он закончит цикл. Это означает, что он проверит только этот первый случай.

Что вы хотите сделать, это проверить каждую букву в str1, если она находится в любом месте str2, удалить этот экземпляр из str2 и проверить следующую букву. Если в любой момент письмо НЕ на str2, верните False. После проверки всех букв, и вы не вернули False, верните True.

Поскольку строки неизменяемы, вы можете сначала поместить их в список и перебрать список.

Проверьте следующий код:

def check_anagram(str1, str2): if len(str1) != len(str2): return False else: string1 = [x for x in str1] # put str1 in list string1 string2 = [x for x in str2] for i in range(0, len(str2), 1): # iterate over the range (length) of str2 if string1[i] in string2: # if letter in position i of string1 occurs in string 2 then: string2.remove(string1[i]) # remove that letter from the string2 list else: return False # if it does NOT occur in string2, it is NOT an anagram, so return false return True # If the loop went correctly, return true

изменить:
Если вы хотите удалить пробелы (пробелы) (так как “ars magna” является анаграммой “анаграмм”, но программа не забирает ее, поскольку длина отличается), вы должны сделать это с самого начала. Замена пробела в строке может быть выполнена с помощью функции .replace(WHAT TO REPLACE, REPLACE WITH THIS). Поместите это право в начале функции check_anagram:

str1 = str1.replace(» «, «») str2 = str2.replace(» «, «») Ответ №1

Два ваших тестовых примера возвращают true, потому что вы не удаляете символы из str2 после того, как вы проверили, что они существуют. Так, например, сравнивая следующие две строки:

str1 = aa и str2 = a

мы ожидаем, что результатом вашего сравнения будет False, потому что они, очевидно, не являются анаграммами. Но проверка каждого из двух символов a в str1 вернет True, потому что str2 также содержит a. Лучшим (и более быстрым) способом может быть обработка строк сначала так:

# return a dictionary, where each key is the # count of that letter in the string def process_str(str): dic = {} for letter in str: if letter in dic: dic[letter] += 1 else: dic[letter] = 1 return dic def check_anagram(str1, str2): dic1 = process_str(str1) dic2 = process_str(str2) # does every key in dic1 have a corresponding key in dic2? for key in dic1: if not key in dic2: return False if not dic1[key] == dic2[key]: return False # does every key in dic2 have a corresponding key in dic1? for key in dic2: if not key in dic1: return False if not dic1[key] == dic2[key]: return False return True

Это должно сделать трюк.

Ответ №2

Я думаю, что самый тривиальный способ выполнить задачу – сортировать свои строки и сравнивать их, как в этом примере:

def check_anagram(a = », b = »): return sorted(a) == sorted(b)

Test1:

a = «python» b = «nohtyp» print(check_anagram(a, b))

Вывод:

>>> True

Test2:

a = «aaaaaaaaaabbbbbbbbb» b = «ababababbbababababab» print(check_anagram(a, b))

Вывод:

>>> False

Test3:

a = «xxxyyyxxx» b = «yyyxxxyyy» print(check_anagram(a, b))

Вывод:

>>> False

Оцените статью
Добавить комментарий