Используя python: из словаря найдите все анаграммы и напечатайте в убывающем размере

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

import time

start_time = time.time()

def wordIterator(dictionaryFilename):
    with open(dictionaryFilename,'r') as f:
        for line in f:
            word = line.strip()
            yield word

def largestAnagram(words):
    import collections
    d = collections.defaultdict(list)
    for word in words:
        sortedWord = str(sorted(word))
        d[ hash(sortedWord) ].append(word)
    maxKey = max( d.keys(), key = lambda k : len(d[k]) )
    while (maxKey != 0):
        maxKey = max( d.keys(), key = lambda k : len(d[k]) )
        print(d[maxKey])
        del d[maxKey]


    return d[maxKey]

ter = wordIterator( 'dictionary.txt' )

print largestAnagram(ter)

end_time = time.time()
print("Elapsed time was %g seconds" %(end_time-start_time))

person user3391308    schedule 07.03.2014    source источник
comment
Можете ли вы показать нам какую-нибудь строку из Dictionary.txt?   -  person James    schedule 07.03.2014


Ответы (1)


Я думаю, вы хотите while (maxKey > 1).

Но ваш алгоритм имеет ненужную квадратичную сложность, более эффективным решением будет:

# ...
keys = [(len(v), k) for k, v in d.items() if len(v) > 1]
keys.sort(reverse=True)
for _, k in keys:
    print(d[k])
person Brave Sir Robin    schedule 07.03.2014