如何在任何给定的txt文件中搜索anagrams并显示该文件中每个单词的字谜。
到目前为止,我可以读取文件,提取每个单词并按字母顺序对每个单词进行排序。我试过制作两个词组,一个包含文本文件中实际单词的词典作为键,字母顺序排列的单词作为值,另一个词典文件的词典以相同的方式设置。< / p>
使用这两个词典我一直无法找到一种有效的方法来为输入列表中的每个单词获取以下输出:
'eerst': steer reste trees
如果我尝试遍历给定列表中的所有单词,并且在每个循环内部循环,在字典内循环,查看和记录字谜,则需要花费太多时间并且效率非常低。如果我尝试以下内容:
for x in input_list:
if x in dictionary:
print dictionary[x]
我只得到每个单词的第一个字谜而不是别的。 如果这有任何意义,任何建议都会非常有用。
答案 0 :(得分:1)
我不确定我正在考虑的是你目前在代码中做了什么,但我想不出更好的事情:
from collections import defaultdict
words = 'dog god steer reste trees dog fred steer'.split() # or words from a file
unique_words = set(words)
anagram_dict = defaultdict(list)
for word in unique_words:
key = "".join(sorted(word))
anagram_dict[key].append(word)
for anagram_list in anagram_dict.values():
if len(anagram_list) > 1:
print(*anagram_list)
这将打印(以任意顺序):
god dog
steer trees reste
如果你想获得字典键值,你可以让最后一个循环超过items
而不是values
的{{1}}(并且你可以打印掉如果你愿意的话,在上面的例子中没有像anagram_dict
这样的字谜。请注意,由于'fred'
,重复的单词不会多次排序。
运行时间应为set
,其中O(M + U*N*log(N))
为单词数,M
为唯一数量,U
为其平均长度。除非你要对有机化学教科书或其他有很多长词的东西进行排序,否则它在输入长度上应该非常接近线性。
答案 1 :(得分:0)
以下是使用itertools.groupby
from itertools import groupby
words = list_of_words
for k, g in groupby(sorted(words, key=sorted), key=sorted):
g = list(g)
if len(g) > 1:
print(g)
big-O复杂性并不像通常的列表字典方法那么好,但它仍然相当有效,当你大声读出它时听起来很有趣