我有一个单词列表,我需要找到字谜并返回一组字谜的列表
例如:
输入:['cat','act','dog','ogd']
输出:[{'cat','act'}, {'dog','ogd'}]
我能够正确编码,但是我需要一个更优化的替代解决方案。有人可以帮我吗?
from collections import defaultdict
def group(words):
d = {}
for word in words:
key = "".join(sorted(word))
d.setdefault(key, set()).add(word)
sets = list(d.values())
return sets
我需要一个更优化的解决方案
答案 0 :(得分:0)
字谜不关心顺序。在考虑这一事实时会想到集。问题是集合不可散列,并且不考虑重复,并且由于不能使用散列,因此比较起来会很慢。
为快速起见,此解决方案尝试避免排序,而更喜欢使用散列:
首先,我们创建一个快速哈希的函数:
import collections
def anagram_hash(word):
return frozenset(collections.Counter(word).items())
然后,我们使用defaultdict一次完成快速聚合:
anagrams = collections.defaultdict(list)
for word in words:
anagrams[anagram_hash(word)].append(word)