2016-09-01 36 views
6

我試圖將字符串列表拆分爲包含這些字符串的不均勻長度的元組列表,每個元組包含最初用空字符串分隔的字符串。基本上我需要可以應用於列表的參數化分割。如果我的初始列表如下所示:將列表分解爲不均勻的元組

init = ['a', 'b', '', 'c', 'd e', 'fgh', '', 'ij', '', '', 'k', 'l', ''] 

此列表的最後一個元素始終是關閉''。可以有連續的''秒,這將被視爲單打。 我需要的結果是:

end = [('a', 'b'), ('c', 'd e', 'fgh'), ('ij',), ('k', 'l')] 

我已經有醜陋的代碼,沒有工作和失控的範圍內,一旦名單被完全彈出:

end = [] 
while init[-1] == u'': 
init.pop() 
l = [] 
while init[-1] != u'': 
    l.append(init.pop()) 
end.append(tuple(l)) 

我想用內涵,但沒有成功嘗試解包參數列表,顛倒自引用列表,使用deque隊列和各種代碼異味,現在我懷疑是否有意尋找(嵌套)理解解決方案?

回答

4

可以使用itertools.groupby功能組根據其大小的元素,像這樣

>>> from itertools import groupby 
>>> init = ['a', 'b', '', 'c', 'd e', 'fgh', '', 'ij', '', '', 'k', 'l', ''] 
>>> [tuple(g) for valid, g in groupby(init, key=lambda x: len(x) != 0) if valid] 
[('a', 'b'), ('c', 'd e', 'fgh'), ('ij',), ('k', 'l')] 

這基本上組根據其長度的元素。如果該項目的長度不等於零,它們將被放入一個組中,直到滿足來自另一個組的元素。對於長度不等於零的元素組,key函數將返回True,否則返回False。我們忽略與False(因此檢查if valid)的組。

+1

這是任何尼斯'bool'更換lambda函數投字符串和得到類似的結果? – Felix

4

這裏是groupby如果你想與一個特殊的分隔符來分割你的列表更簡潔和通用的方法:

>>> delimiter = '' 
>>> [tuple(g) for k, g in groupby(init, delimiter.__eq__) if not k] 
[('a', 'b'), ('c', 'd e', 'fgh'), ('ij',), ('k', 'l')]