Хорошо, поэтому у меня есть две функции: одна, которая проверяет, сколько раз символ появляется в строке, а другой, который должен проверять, являются ли две строки входными данными пользователя анаграммами:
def function_one(s, ch):
count = 0
for c in s:
if c == ch:
count = count + 1
return count
def function_two(s, t):
while len(s) == len(t):
y = function_one(s, t)
if y == 0:
return True
else:
return False
Прямо сейчас function_two вернет True, если две строки являются анаграммами, но также вернет True, если они являются анаграммами, но имеют разные буквы с заглавной буквы и ничего не вернут, если они не являются анаграммами вообще. Что я делаю?
Вы можете сортировать пары строк, которые не являются анаграммами, сначала проверяя длину обеих строк. На втором этапе вы можете сравнить набор символов. Это очень быстро в Python. На последнем этапе вам нужно подсчитать, как отдельные символы в наборе должны быть уверены, что строки являются анаграммами.
КОД
from __future__ import print_function
def isAnagram(s1, s2) :
s1, s2 = s1.lower(), s2.lower()
if len(s1) == len(s2) :
if set(s1) == set(s2) :
return all([s1.count(c) == s2.count(c) for c in set(s1)])
return False
string1 = 'Hello'
string2 = 'Hell' # No anagram of string1
string3 = 'Holle' # Anagram of string1
print(isAnagram(string1, string2))
print(isAnagram(string1, string3))
ВЫХОД
False
True
Там много способов сделать это. Я думаю, вы немного усложняете, написав эти функции.
Первый способ решить это, который пришел мне на ум, - создать список со всеми буквами в каждой строке, отсортировать их и сравнить оба списка:
def check_for_anagrams(string1, string2):
list1 = list(string1.lower())
list2 = list(string2.lower())
list1.sort()
list2.sort()
return list1 == list2
это может быть не самый элегантный способ сделать это, но это быстрое решение. функция lower() превращает строки в нижний регистр, функция sort() для списков сортирует список.
если две строки являются анаграммами, результатом этих операций будет два равных списка.
EDIT: Проверьте возможную дублируемую тему, там есть хорошие решения!
list(string.lower())
. Нет необходимости использовать понимание списка.
function_one()
с двумя полными строками, а не строкой и буквой - попробуйте вызвать его таким образом (напрямую, чтобы вы могли проверить результаты) и посмотреть, что произойдет.