@VishenkaNaTorte

Как найти все пары анаграмм?

Есть строка. Необходимо в ней найти и вывести все пары анаграмм.

К примеру, для строки Кот нос ток сон должно вывести:

кот ток
нос сон


Мое решение выглядит так

text = input().lower() 
arr = text.split(' ')
arr.sort()
for x1 in arr:
    for x2 in arr:
        common_letters = len(set(x1) & set(x2)) 
        if (len(x1) == len(x2) and (common_letters == len(x1)) and (x1 != x2)):
            print(x1, x2)


Но проблема в том, что он выводит в два раза больше пар

кот ток
нос сон
сон нос
ток кот


Как можно убрать одинаковые пары? (такие, как кот ток и ток кот, например)
  • Вопрос задан
  • 328 просмотров
Решения вопроса 1
@o5a
Проверки
common_letters == len(x1)
недостаточно для слов с повторяющимися буквами, например "рамма марма" оно не посчитает анаграммой. Для сравнения анаграмм можно использовать или отсортированные по буквам слова (sorted("кот") == sorted("ток")) или collections.Counter() , он возвращает словарь с частотой использования букв в слове, оба позволят однозначно подбирать анаграммы.

Вариант через отсортированные строки (группируем результаты в словарь, позволит избавиться от повторного прохода по списку слов, позволит группировать сколько угодно анаграмм, а не только 2)
from collections import defaultdict

text = "кот нос ток сон клад рама вход книга вдох рамма марма мрама"
arr = text.split(' ')

result = defaultdict(set)

for word in arr:
    sort_word = ''.join(sorted(word))
    result[sort_word].add(word)

# выводим только парные результаты (2+ анаграмм)
print([v for k,v in result.items() if len(v) > 1])

#[{'кот', 'ток'}, {'нос', 'сон'}, {'вход', 'вдох'}, {'рамма', 'мрама', 'марма'}]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы