【发布时间】:2017-05-23 04:58:26
【问题描述】:
解决以下分组字谜的问题。我目前的解决方案是按单个字符对每个单词进行排序,然后将相同的排序值映射到字典中。
想知道是否有更好的算法时间复杂度更低的想法?我正在考虑不进行排序的方法,例如散列,但散列也需要单词的顺序字符。
发布问题和我的代码,用 Python 2.7 编写。
问题,
给出一个单词列表,如 [rats,star,arts,cie,ice],将相同的字谜分组到桶中并输出。 [老鼠,明星,艺术] [cie,冰]
源代码,
from collections import defaultdict
def group_anagram(anagrams):
result = defaultdict(list)
for a in anagrams:
result[''.join(sorted(list(a)))].append(a)
return result
if __name__ == "__main__":
anagrams = ['rats', 'star', 'arts', 'cie', 'ice']
print group_anagram(anagrams)
【问题讨论】:
-
如果是工作代码,这个问题在 Code Review 上不是更好吗?
-
@Tagc,代码审查是审查现有代码,但我的问题更多的是询问是否有更好(时间复杂度较低)的解决方案(这与我当前的代码无关,我展示了我当前的代码为更好的解决方案进行基准测试的目的)。
-
from itertools import groupby; {k:list(v) for k,v in groupby(anagrams, key = lambda x: ''.join(sorted(x)))}是一个解决方案。将其与您已有的进行比较。 -
您的解决方案似乎很好。小点:
''.join(sorted(list(a)))中使用list没有意义。字符串已经是可迭代的,sorted可以直接应用于它。 -
我认为您的意思是
return result.values()而不仅仅是return result。代码相当快。在包含 264,097 个单词的yawl单词列表上运行大约需要 1 秒。代码将它们分成 235,485 个桶,这意味着大约有 30,000 个重要的字谜。
标签: python algorithm python-2.7 anagram