通过Python查找和分组字谜

Nul*_*ptr 4 python list-comprehension anagram

input: ['abc', 'cab', 'cafe', 'face', 'goo']
output: [['abc', 'cab'], ['cafe', 'face'], ['goo']]
Run Code Online (Sandbox Code Playgroud)

问题很简单:它由字谜组成.订单无关紧要.

当然,我可以通过C++(这是我的母语)来做到这一点.但是,我想知道这可以通过Python一行中完成.编辑:如果不可能,可能是2或3行.我是Python的新手.

为了检查两个字符串是否是字谜,我使用了排序.

>>> input = ['abc', 'cab', 'cafe', 'face', 'goo']
>>> input2 = [''.join(sorted(x)) for x in input]
>>> input2
['abc', 'abc', 'acef', 'acef', 'goo']
Run Code Online (Sandbox Code Playgroud)

我认为通过组合等可能是可行的map.但是,我需要使用a dict作为哈希表.我还不知道这是否可以在一行中完成.任何提示都会被贬低!

Dav*_*ebb 8

可读的单线解决方案:

output = [list(group) for key,group in groupby(sorted(words,key=sorted),sorted)]
Run Code Online (Sandbox Code Playgroud)

例如:

>>> words = ['abc', 'cab', 'cafe', 'goo', 'face']
>>> from itertools import groupby
>>> [list(group) for key,group in groupby(sorted(words,key=sorted),sorted)]
[['abc', 'cab'], ['cafe', 'face'], ['goo']]
Run Code Online (Sandbox Code Playgroud)

这里的关键是itertools.groupbyitertools模块中使用,该模块将列表中的项目组合在一起.

我们提供的清单groupby必须先进行分类,以便我们通过sorted(words,key=sorted).这里的技巧是sorted可以接受一个键功能,并根据这个函数的输出进行排序,所以我们sorted再次作为键函数传递,这将按顺序使用字符串的字母对单词进行排序.没有必要定义我们自己的函数或创建一个lambda.

groupby它使用一个关键函数来判断项目是否应该组合在一起,我们可以再次将内置sorted函数传递给它.

最后要注意的是输出是键对和组对象的对,因此我们只需要使用分组对象并使用list函数将它们中的每一个转换为列表.

(顺便说一句 - 我不会把你的变量input称为隐藏内置input函数,尽管它可能不是你应该使用的那个.)