2011-09-02 41 views
4

从排序后的可迭代对象开始,我需要按照它们的第一个字符(例如,从a到z的每个字母组成的组以及用于数字和符号的组)来分组这些项目。如何根据项目的第一个字符对迭代对象中的项目进行分组?

对于更具体的例子,让我们说我有这样的名单:

L = [ 'AA', 'AB', '交流', '巴', 'BB', '公元前',“CA ' 'CB', '抄送', '10', '%A', 'b',...]

,我需要这样的东西:

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

这样做的选择有哪些,哪个最有效?

回答

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()' –

+0

@Darren,是的,谢谢 – eumiro

+0

@eumiro:很明显我不得不使用groupby但其余的都在我头上。感谢您提供明确的解决方案 – andreliebschner

相关问题