Поиск больших анаграмм не читает до конца набора Python

У меня есть фрагмент кода, который проверяет анаграммы длинного списка слов. Я пытаюсь найти способ перебрать каждое слово в моем длинном списке слов, чтобы найти другие анаграммы, которые могут соответствовать этому слову. Некоторые слова должны иметь более одной анаграммы в моем списке слов, но я не могу найти решение, чтобы присоединиться к анаграммам, найденным в моем списке.


set(['biennials', 'fawn', 'unsupportable', 'jinrikishas', 'nunnery', 'deferment', 'surlinesss', 'sonja', 'bioko', 'devon'] ect...

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

anagrams_found = {'diss': 'sids', 'abels': 'basel', 'adens': 'sedna', 'clot': 'colt', 'bellow': 'bowell', 'cds': 'dcs', 'doss': 'sods', '
als': 'las', 'abes': 'base', 'fir': 'fri', 'blot': 'bolt', 'ads': 'das', 'elm': 'mel', 'hops': 'shop', 'achoo': 'ochoa'... and more}

Мне было интересно, где мой код оборвался. Он должен найти намного больше анаграмм из моего словаря слов Linux. Может ли кто-нибудь увидеть, что не так с моим фрагментом кода? Проще говоря, сначала программа перебирает каждое слово, которое у меня есть, а затем проверяет, содержат ли наборы мои ключи. Позже в мой словарь будут добавлены ключи для слов, которые также будут соответствовать моему тому же key. Если уже есть key, для которого я добавил анаграмму, я обновлю свой словарь, объединив старое значение dict с новым словом (анаграмма)

    anagram_list = dict()
    words = set(words)
    anagrams_found = []
    for word in words:
        key = "".join(sorted([w for w in word]))
        if (key in words) and (key != word):
            anagrams_found.append(word)
            for name, anagram in anagram_list.iteritems():
                if anagram_list[name] == key:
                    anagram = " ".join([anagram],anagram_found)
                    anagram_list.update({key:anagram})
            anagram_list[key] = word
    return anagram_list

В общем, возможно, эта программа неэффективна. Может кто-нибудь объяснить недостатки моего кода?


person lzc    schedule 08.10.2013    source источник
comment
Вы изменяете anagram_list во время итерации. Для быстрой проверки замените iteritems() на простой items() и посмотрите, исправит ли это что-нибудь.   -  person Tim Peters    schedule 08.10.2013
comment
См. Найдите анаграммы для списка слов и answer   -  person tehsockz    schedule 08.10.2013


Ответы (1)


anagram_dict = {} # You could also use defaultdict(list) here
for w in words:
    key = "".join(sorted(w))
    if key in anagram_dict:
        anagram_dict[key].append(w)
    else:
        anagram_dict[key] = [w]

Теперь записи, у которых есть только один элемент в списке, не являются анаграммами, поэтому

anagram_list = []
for v in anagram_dict.iteritems():
    if len(v) > 1:
        anagram_list += v
person John La Rooy    schedule 08.10.2013
comment
Если вы используете defaultdict(list), вам не нужен _2 _ / _ 3_, вы можете просто добавить в anagram_dict[key] без проверки - person John La Rooy; 08.10.2013
comment
это такой эффективный метод, но я не вижу, где программа сопоставляет ключ с текущим словом. - person lzc; 08.10.2013
comment
@czl, он работает, делая вид, что все слова являются анаграммами, группируя их по отсортированным буквам. Любые настоящие анаграммы будут иметь два или более элемента в своем списке по завершении цикла. - person John La Rooy; 08.10.2013