更优化的解决方案

时间:2019-04-23 12:23:09

标签: python-3.x

我有一个单词列表,我需要找到字谜并返回一组字谜的列表 例如: 输入:['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

我需要一个更优化的解决方案

1 个答案:

答案 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)