Python Anagram Finder из данного файла

Я пробовал абсолютно все под солнцем, чтобы понять это и ничего не получил. Я даже не знаю, как подойти к проблеме. Инструкции следующие:

Ваша программа запросит у пользователя имя файла, содержащего список слов. Список слов форматируется, чтобы иметь по одному слову в каждой строке. • Для каждого слова найдите все анаграммы (некоторые из них более одного) этого слова. • Результат: укажите, сколько слов содержит 0, 1, 2 и т. Д., Анаграммы. Выведите список слов, которые образуют большинство анаграмм (если есть несколько наборов с одинаковой максимальной длиной, выведите все из них). • Вы должны использовать соответствующую функциональную декомпозицию.

Пожалуйста, имейте в виду, что я программировал чуть меньше месяца, чтобы все было настолько глупо, насколько возможно. Заранее спасибо.

    Я считаю, что это домашнее задание. Вы знаете, что анаграммы – это просто перестановки слова. Возьмите вещи медленно: научитесь вычислять анаграмму для одного слова, прежде чем вы узнаете, как это сделать для многих слов. Следующий интерактивный сеанс показывает, как вычислять анаграмму слова. Вы можете продолжать оттуда.

    >>> # Learn how to calculate anagrams of a word >>> >>> import itertools >>> >>> word = 'fun' >>> >>> # First attempt: anagrams are just permutations of all the characters in a word >>> for permutation in itertools.permutations(word): ... print permutation ... ('f', 'u', 'n') ('f', 'n', 'u') ('u', 'f', 'n') ('u', 'n', 'f') ('n', 'f', 'u') ('n', 'u', 'f') >>> >>> # Now, refine the above block to print actual words, instead of tuple >>> for permutation in itertools.permutations(word): ... print ''.join(permutation) ... fun fnu ufn unf nfu nuf >>> # Note that some words with repeated characters such as 'all' >>> # has less anagrams count: >>> word = 'all' >>> for permutation in itertools.permutations(word): ... print ''.join(permutation) ... all all lal lla lal lla >>> # Note the word 'all' and 'lla' each repeated twice. We need to >>> # eliminate redundancy. One way is to use set: >>> word = 'all' >>> anagrams = set() >>> for permutation in itertools.permutations(word): ... anagrams.add(''.join(permutation)) ... >>> anagrams set(['lal', 'all', 'lla']) >>> for anagram in anagrams: ... print anagram ... lal all lla >>> # How many anagrams does the word 'all' have? >>> # Just count using the len() function: >>> len(anagrams) 3 >>> 

    Я вставил вышеприведенную сессию здесь для вашего удобства.

    Обновить

    Теперь с разъяснением Аарона. Проблема на самом низком уровне: как вы определяете, являются ли два слова анаграммами? Ответ: «Когда у них одинаковое количество букв». Самый простой способ (для меня) – отсортировать все буквы и сравнить их.

     def normalize(word): word = word.strip().lower() # sanitize it word = ''.join(sorted(word)) return word # sort_letter('top') ==> 'opt' # Are 'top' and 'pot' anagrams? They are if their sorted letters are the same: if normalize('top') == normalize('pot'): print 'they are the same' # Do something 

    Теперь, когда вы знаете, как сравнивать два слова, давайте работать над списком слов:

     >>> import collections >>> anagrams = collections.defaultdict(list) >>> words = ['top', 'fun', 'dog', 'opt', 'god', 'pot'] >>> for word in words: ... anagrams[normalize(word)].append(word) ... >>> anagrams defaultdict(<type 'list'>, {'opt': ['top', 'opt', 'pot'], 'fnu': ['fun'], 'dgo': ['dog', 'god']}) >>> for k, v in anagrams.iteritems(): ... print k, '-', v ... opt - ['top', 'opt', 'pot'] fnu - ['fun'] dgo - ['dog', 'god'] 

    В предыдущем сеансе мы используем anagrams (defaultdict, который является таким же, как dict со значениями по умолчанию) для хранения списка слов. Клавиши – это отсортированные буквы. Это означает, что anagrams['opt'] ==> ['top', 'opt', 'pot'] . Оттуда вы можете узнать, у кого больше анаграмм. Остальное должно быть достаточно простым.