2011-09-02 61 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

相關問題