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

Входными данными этой функции являются две строки, и цель состоит в том, чтобы определить, являются ли эти две строки анаграммами. Например, «qwerty» и «qetyrw» являются анаграммами, что означает, что перестановка символов в первой строке может получить вторую строку без учета регистра. «qwerty» и «QWerTY» также являются анаграммами. Меня просто смущает моя функция, которая ничего не возвращает.

Моя функция заключается в следующем:

def is_anagram(string_a,string_b):
    """returns True if the strings are anagrams of each other

    str, list -> boolean"""
    new_a=string_a.lower()
    new_b=string_b.lower()
    i=0
    if len(string_a)!=len(string_b):
        return False
    else:
        while i<=len(new_a)-1:
            if new_a[i] in new_b:
                list(new_b).remove(new_a[i])
            i=i+1
            break
        if len(list(new_b))==0:
            return True
        else:
            return False

person colalove    schedule 22.03.2015    source источник


Ответы (4)


Сортировка для определения, является ли строка анаграммой другой, занимает O(n logn) времени. Вместо этого мы можем использовать объект-счетчик, который подсчитывает вхождения каждой буквы:

from collections import Counter

def is_anagram(string_a, string_b):
    return Counter(string_a.lower()) == Counter(string_b.lower())

Это займет среднее линейное время. Основное наблюдение состоит в том, что две строки анаграммы имеют одинаковые частоты букв.

Примеры:

>>> is_anagram("abc", "aaa")
False
>>> is_anagram("abc", "aac")
False
>>> is_anagram("abc", "acb")
True
person JuniorCompressor    schedule 22.03.2015

Вам просто нужно отсортировать строки:

def is_anagram(string_a, string_b):
    return sorted(string_a.lower()) == sorted(string_b.lower())
person Julien Spronck    schedule 22.03.2015

Вы можете использовать класс Counter:

from collections import Counter

def is_anagram(string_a,string_b):
    return Counter(string_a.lower()) == Counter(string_b.lower())
person shx2    schedule 22.03.2015

Ваш код ошибочен в «списке (new_b)», он не сохраняется, поэтому каждый раз он будет рассматриваться как новый список.

И "разрыв" в цикле while тоже не нужен.

Пожалуйста, попробуйте следующий код:

def is_anagram(string_a,string_b):
    """returns True if the strings are anagrams of each other

    str, list -> boolean"""
    new_a=string_a.lower()
    new_b=string_b.lower()
    i=0
    if len(string_a)!=len(string_b):
        return False
    else:
        list_b = list(new_b) # store the list(new_b) into list_b
        while i<=len(new_a)-1:
            if new_a[i] in list_b:
                list_b.remove(new_a[i])
            i=i+1
           #break should be removed! 
        if len(list_b)==0:
            return True
        else:
            return False
person xirururu    schedule 22.03.2015