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} |
号
每次都用新字典替换
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可以整理