关于python:合并附加到字典中的相似键的值

Merging values attached to like keys in dictionary

我要做的是取一个文本文件并返回文件中的变位词词典(按字母顺序重新排列后会生成新单词的单词)。因此,如果文件包含单词dub和bud,那么代码应该创建一个键bdu,并将字符串dub和bud附加到tuple或list中,或者您拥有的内容中。

现在,我的代码输出的正是我想要的,除了一个具有多个值的键之外,我得到的每个值的键都是相同的。为了回到我以前的例子,我得到了dub的bdu键,然后是bud的另一个bdu键。如何删除相同的键并将键值合并为一个键?

1
2
3
4
5
6
7
8
9
10
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

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


在collections包中,python的defaultdict类型对于这类事情很有用。

1
2
3
4
5
6
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)

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

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


这个

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

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

1
2
3
4
5
6
7
for w in wordget:
    key = ''.join(sorted(word))
    if key in dic:
        dic[key].append(word)
    else:
        dic[key] = [word]
 return dic

使用grantj的答案中的defaultdict可以整理ifelse块。