python - 通过 Python 查找和分组字谜

标签 python list-comprehension anagram

input: ['abc', 'cab', 'cafe', 'face', 'goo']
output: [['abc', 'cab'], ['cafe', 'face'], ['goo']]

问题很简单:它按字谜 分组。顺序无关紧要。

当然,我可以用 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']

我认为通过组合 map 左右可能是可行的。但是,我需要使用 dict 作为哈希表。我还不知道这是否可以在一行中完成。任何提示将不胜感激!

最佳答案

一个可读的单行解决方案:

output = [list(group) for key,group in groupby(sorted(words,key=sorted),sorted)]

例如:

>>> 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']]

这里的关键是使用 itertools.groupby from the itertools module这会将列表中的项目组合在一起。

我们提供给 groupby 的列表必须预先排序,所以我们将它传递给 sorted(words,key=sorted)。这里的技巧是 sorted 可以接受一个键函数,并根据这个函数的输出进行排序,所以我们再次传递 sorted 作为键函数,这将排序单词按顺序使用字符串的字母。无需定义我们自己的函数或创建 lambda

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

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

(顺便说一句 - 我不会将你的变量 input 称为你的隐藏 the built-in input function ,尽管它可能不是你应该使用的。)

关于python - 通过 Python 查找和分组字谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8181513/

相关文章:

python - Pandas 修剪数据的更好方法

python - 从基于 Popen() 的子进程写入的文件中读取不完整

python - 检测轻微噪声数据的逐渐增加然后减少

python - 变量名应该在名词之前或之后有形容词吗?

functional-programming - 是否有 Python 惯用语用于评估具有短路的函数/表达式列表?

python - Nim相当于Python的列表理解

python - 列表理解和 for 循环中的 Lambda

javascript - JavaScript Anagram 函数的时间复杂度

java - 字谜的改进

Python-给定输入字母的可能的英语单字变位词