如何在任何给定的 txt 文件中搜索字谜并显示该文件中每个单词的字谜。
到目前为止,我可以阅读文件,提取每个单词并按字母顺序对每个单词进行排序。我尝试制作两个字典,一个字典包含文本文件中的实际单词作为键,按字母顺序排序的单词版本作为值,另一个字典文件的字典文件以相同的方式设置。
使用这两个词典,我一直无法找到一种有效的方法来为输入列表中的每个单词获取以下输出:
'eerst': steer reste trees
如果我尝试遍历给定列表中的所有单词,并在每个循环中循环字典,查找和记录字谜,则需要花费太多时间并且效率非常低。如果我尝试以下操作:
for x in input_list:
if x in dictionary:
print dictionary[x]
我只得到每个单词的第一个字谜,没有别的。如果这有任何意义,任何建议都将非常有帮助。
我不确定我正在考虑的是否是您当前在代码中正在做的事情,但我想不出更好的方法:
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
而不是anagram_dict
的values
上(如果需要,可以打印出没有任何字谜的单词,如上例中的'fred'
(。请注意,由于set
,重复的单词不会多次排序。
运行时间应O(M + U*N*log(N))
其中M
是单词的数量,U
是唯一单词的数量,N
是它们的平均长度。除非您正在对有机化学教科书或其他包含大量长单词的内容进行排序,否则输入的长度应该非常接近线性。
这是另一种使用 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的复杂性不如通常的列表字典方法那么好,但它仍然相当有效,当你大声朗读它时听起来很有趣