возвращает словарь с несколькими экземплярами для каждого символа

#python #python-3.x #dictionary

Вопрос:

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

 >>> eh_anagrama(’caso’, ’SaCo’)
True
>>> eh_anagrama(’caso’, ’casos’)
False
 

Ответ №1:

Простой, но логарифмически линейный подход:

 def eh_anagrama(s1, s2):
    return sorted(s1.lower()) == sorted(s2.lower())
 

Лучший линейный подход, используя collections.Counter :

 from collections import Counter

def eh_anagrama(s1, s2):
    return Counter(s1.lower()) == Counter(s2.lower())
 

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

Ответ №2:

Как насчет этого с результатом и подсчетом символов в dict.

код

 def anagram(s1, s2):
    ana = sorted(s1.lower()) == sorted(s2.lower())
    
    d1 = {}
    d2 = {}
    for x in set(s1):  # Get unique char
        d1.update({x: s1.count(x)})  # Count each char
    for x in set(s2):
        d2.update({x: s2.count(x)})

    return {'anagram': ana, s1: d1, s2: d2}


s1 = 'caso'
s2 = 'SaCo'
res1 = anagram(s1, s2)
print(res1)

s1 = 'caso'
s2 = 'casos'
res2 = anagram(s1, s2)
print(res2)
 

Выход:

 {'anagram': True, 'caso': {'o': 1, 's': 1, 'c': 1, 'a': 1}, 'SaCo': {'o': 1, 'C': 1, 'a': 1, 'S': 1}}
{'anagram': False, 'caso': {'o': 1, 's': 1, 'c': 1, 'a': 1}, 'casos': {'o': 1, 's': 2, 'c': 1, 'a': 1}}