Поиск анаграмм Python из данного файла

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

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

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


person Aaron    schedule 15.03.2013    source источник
comment
Пролей немного света и покажи нам одну из своих попыток, чтобы мы могли понять, откуда ты взялась.   -  person FatalError    schedule 15.03.2013


Ответы (1)


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

>>> # 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['opt'] ==> ['top', 'opt', 'pot']. Оттуда вы можете сказать, у кого больше всего анаграмм. Остальное должно быть достаточно легко.

person Hai Vu    schedule 15.03.2013
comment
Может быть, я недостаточно ясно объяснил, мой инструктор дал мне файл с именем wordlist.txt и ожидает, что я напишу программу, которая просматривает слова и находит, какие слова являются анаграммами друг друга. Моя первоначальная мысль заключалась в том, чтобы разбить список слов на подсписок каждого слова, а затем использовать функцию сортировки для сортировки каждого из этих слов в алфавитном порядке, чтобы, например, способность и тюк стали абелем и абелем. Затем я бы написал функцию, которая сравнила бы все эти подсписки, чтобы найти анаграммы. Это была моя первоначальная идея, но у меня много проблем. Есть идеи? - person Aaron; 15.03.2013
comment
Я все еще в замешательстве. Прямо сейчас у меня есть список. acert", "alnw", "ilst", "acer", "acert", "eehst", "ilst", "ilst", "acert"] И я пытаюсь найти способ написать функцию, которая просматривает список и выясняет, сколько раз каждое отсортированное слово появляется в списке. - person Aaron; 15.03.2013