如何基于项的第一个字符将可迭代对象中的项目分组?

4

从一个已排序的可迭代对象开始,我需要按它们的第一个字符分组(例如每个字母从a到z和数字和符号各一组)。

举个更具体的例子,假设我有这个列表:

L = ['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc', '10', '%a', ' b', ...]

我需要得到如下结果:

GL = [['aa', 'ab', 'ac'], ['ba', 'bb', 'bc'], ['ca', 'cb', 'cc'], ['10', '%a', ' b']]

有哪些选项可以实现这个功能,并且哪种方法最有效?

1个回答

9
import itertools as it

L = ['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc', '10', '%a', ' b']

sorter = lambda x: x[0].lower() if x and x[0].isalpha() else '}'
GL = [list(v) for k, v in it.groupby(sorted(L, key=sorter), key=sorter)]

返回值:

[['aa', 'ab', 'ac'],
 ['ba', 'bb', 'bc'],
 ['ca', 'cb', 'cc'],
 ['10', '%a', ' b']]

在排序时,您可以使用其他字符代替 '}',将所有非字母字符放在正确的位置。


1
如果列表中存在一个空字符串,则可能需要使用if x and x[0].isalpha() 条件判断语句。 - Darren Yin
@eumiro:我明白我必须使用groupby,但其他部分有点超出我的能力范围。感谢您提供清晰的解决方案。 - andreliebschner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接