大型字谜搜索未读取到集合 Python 的末尾
Posted
技术标签:
【中文标题】大型字谜搜索未读取到集合 Python 的末尾【英文标题】:Large anagram search not reading to end of set Python 【发布时间】:2013-10-14 20:03:48 【问题描述】:我这里有一段代码可以检查一长串单词的字谜。我试图找出如何在我的长单词列表中搜索每个单词以找到可以匹配这个单词的其他字谜。有些单词在我的单词列表中应该有多个字谜,但我无法找到加入列表中的字谜的解决方案。
set(['biennials', 'fawn', 'unsupportable', 'jinrikishas', 'nunnery', 'deferment', 'surlinesss', 'sonja', 'bioko', 'devon'] ect...
因为我一直在使用集合,所以集合永远不会读到最后,它只返回最短的单词。我知道应该有更多。我一直在尝试在我的整个words
集合上迭代我的密钥,这样我就可以找到所有与我的密钥有关的字谜。
anagrams_found = 'diss': 'sids', 'abels': 'basel', 'adens': 'sedna', 'clot': 'colt', 'bellow': 'bowell', 'cds': 'dcs', 'doss': 'sods', '
als': 'las', 'abes': 'base', 'fir': 'fri', 'blot': 'bolt', 'ads': 'das', 'elm': 'mel', 'hops': 'shop', 'achoo': 'ochoa'... and more
我想知道我的代码在哪里被截断了。它应该从我的 Linux 词典中找到更多的字谜。谁能看到我的代码有什么问题?简单地说,首先程序遍历我拥有的每个单词,然后检查集合是否包含我的键。这会将键附加到我的字典中,以便稍后也与我相同的key
匹配。如果我已经为 key
添加了字谜,我将通过将旧 dict 值与新词(字谜)连接来更新我的字典
anagram_list = dict()
words = set(words)
anagrams_found = []
for word in words:
key = "".join(sorted([w for w in word]))
if (key in words) and (key != word):
anagrams_found.append(word)
for name, anagram in anagram_list.iteritems():
if anagram_list[name] == key:
anagram = " ".join([anagram],anagram_found)
anagram_list.update(key:anagram)
anagram_list[key] = word
return anagram_list
总而言之,这个程序可能效率不高。有人可以解释我的代码的缺点吗?
【问题讨论】:
你正在修改anagram_list
而你正在迭代它。如需快速检查,请将iteritems()
更改为纯items()
并查看是否可以解决任何问题。
见“Find anagrams for a list of words”和answer
【参考方案1】:
anagram_dict = # You could also use defaultdict(list) here
for w in words:
key = "".join(sorted(w))
if key in anagram_dict:
anagram_dict[key].append(w)
else:
anagram_dict[key] = [w]
现在列表中只有一项的条目不是字谜所以
anagram_list = []
for v in anagram_dict.iteritems():
if len(v) > 1:
anagram_list += v
【讨论】:
如果你使用defaultdict(list)
,你不需要if
/else
,你可以直接追加到anagram_dict[key]
而不检查
这是一个非常有效的方法,但是我看不到程序在哪里匹配 key 与当前单词。
@czl,它的工作原理是假装所有单词都是按其排序字母分组的字谜。当循环结束时,任何真正的字谜都会在其列表中包含两个或更多项目。以上是关于大型字谜搜索未读取到集合 Python 的末尾的主要内容,如果未能解决你的问题,请参考以下文章
大型集合的 Firestore DeadlineExceeded 异常