Как проверить, являются ли две строки анаграммами и чувствительны ли они к регистру в Python?

1

Хорошо, поэтому у меня есть две функции: одна, которая проверяет, сколько раз символ появляется в строке, а другой, который должен проверять, являются ли две строки входными данными пользователя анаграммами:

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, если они являются анаграммами, но имеют разные буквы с заглавной буквы и ничего не вернут, если они не являются анаграммами вообще. Что я делаю?

  • 7
    Возможный дубликат проверки строк друг против друга (анаграммы)
  • 0
    Ваш код имеет различные проблемы, вы должны проверять и тестировать его шаг за шагом. Обратите внимание, что вы вызываете function_one() с двумя полными строками, а не строкой и буквой - попробуйте вызвать его таким образом (напрямую, чтобы вы могли проверить результаты) и посмотреть, что произойдет.
Теги:
anagram

2 ответа

0

Вы можете сортировать пары строк, которые не являются анаграммами, сначала проверяя длину обеих строк. На втором этапе вы можете сравнить набор символов. Это очень быстро в 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
0

Там много способов сделать это. Я думаю, вы немного усложняете, написав эти функции.

Первый способ решить это, который пришел мне на ум, - создать список со всеми буквами в каждой строке, отсортировать их и сравнить оба списка:

def check_for_anagrams(string1, string2):
    list1 = list(string1.lower())
    list2 = list(string2.lower())
    list1.sort()
    list2.sort()

    return list1 == list2

это может быть не самый элегантный способ сделать это, но это быстрое решение. функция lower() превращает строки в нижний регистр, функция sort() для списков сортирует список.

если две строки являются анаграммами, результатом этих операций будет два равных списка.

EDIT: Проверьте возможную дублируемую тему, там есть хорошие решения!

  • 0
    Кстати, попробуйте использовать более описательные имена в переменных, в противном случае код трудно читать.
  • 0
    Чтобы преобразовать строку в список нижних символов, вам просто нужно вызвать list(string.lower()) . Нет необходимости использовать понимание списка.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню