1

我想要做的是获取一个文本文件并返回文件中的字谜(按字母顺序重新排列时产生新单词的单词)的字典。因此,如果文件包含单词 dub 和 bud,那么代码应该创建一个密钥 bdu 并将字符串 dub 和 bud 附加到它们的元组或列表中,或者你有什么。

现在我的代码准确地输出了我想要的东西,除了一个具有多个值的键,我为每个值获取相同的键。回到我之前的例子,我得到了一个用于配音的 bdu 键,然后是另一个用于 bud 的 bdu 键。我将如何删除相同的键并将键值合并到一个键?

def anagrams(f):
    '''takes a file and returns a list of anagrams in the file'''
    wordget = open(f).read().lower().split()
    dic = {}
    for w in wordget:
        if ("".join(sortword(w))) in wordget:
            dic = {("".join(sortword(w))):w}
            for key in dic.keys():
                print "'%s': %s" % (key, dic[key])
    return None

任何帮助,将不胜感激。我希望提出一个运行速度也很快的解决方案,即使文件包含数万个单词(如书籍)

4

2 回答 2

1

Python 在 collections 包中的defaultdict类型对这种事情很有用。

from collections import defaultdict
from pprint import pprint
answer = defaultdict(list)
for word in open(filename).read().lower().split():
    answer[''.join(sorted(word))].append(word)
pprint(answer)

defaultdict 初始化接受一个初始化对象的函数。在这种情况下,我们初始化一个可以立即附加的空列表。

您可能还会发现pprint模块很有用。它会很好地格式化您的单词列表。

于 2013-10-16T04:11:43.577 回答
0

这个

dic = {("".join(sortword(w))):w}

dic每次都用新字典替换。您应该插入键或附加到列表中

for w in wordget:
    key = ''.join(sorted(word))
    if key in dic:
        dic[key].append(word)
    else:
        dic[key] = [word]
 return dic

可以使用defaultdict 整理if/块,如 GrantJ 的回答else

于 2013-10-16T05:20:52.090 回答