我要做的是获取一个文本文件并返回字谜中的字典(在按字母顺序重新排列时生成一个新单词的单词)。因此,如果文件包含单词dub和bud,那么代码应该创建一个键bdu,并在元组或列表中将字符串dub和bud附加到它们或者你有什么。
现在我的代码输出正是我想要的,除了不是一个具有多个值的键,我得到每个值的相同键。为了回到我之前的例子,我获得了dub的关键字bdu,然后是另一个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
任何帮助将不胜感激。我希望能够提出一个快速运行的解决方案,即使包含数万个单词的文件(如书籍)
答案 0 :(得分:1)
集合包中的Python 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模块很有用。它可以很好地格式化你的单词列表。
答案 1 :(得分: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
/ else
块进行整理,如GrantJ的回答