2017-07-19 35 views
3

我有一個這樣的名單:Python的切割清單某個字詞

[["tab1", None], ["val1", 10], ["val2", "test"], ["val3", 20], ["tab2", None], ["val4", "test"], ["val5", 30]] 

和我正在尋找那截在正表,如果單詞「選項卡」找到一個方法,其結果可能是這個:

list1 = [["val1", 10], ["val2", "test"], ["val3", 20]] 

list2 = [["val4", "test"], ["val5", 30]] 

我嘗試了一些循環,但沒有做任何事情。

但我不知道這是如何與python可能的。 有人有想法嗎?

在此先感謝

+0

列表中是否總是隻有兩個「tab」? – moritzg

回答

7

我贊成一個簡單的for循環此:

In [56]: new_l = [] 

In [57]: for i in l: 
    ...:  if 'tab' in i[0]: 
    ...:   new_l.append([]) 
    ...:  else: 
    ...:   new_l[-1].append(i) 
    ...:   

In [58]: new_l 
Out[58]: 
[[['val1', 10], ['val2', 'test'], ['val3', 20]], 
[['val4', 'test'], ['val5', 30]]] 

有可能是一個更短的解決方案,但我懷疑這會是一個更好的。

編輯:找到一個較短的版本itertools.groupby(還是喜歡循環雖然):

In [66]: [list(v) for _, v in filter(lambda x: x[0], itertools.groupby(l, key=lambda x: 'tab' not in x[0]))]  
Out[66]: 
[[['val1', 10], ['val2', 'test'], ['val3', 20]], 
[['val4', 'test'], ['val5', 30]]] 
+0

希望知道爲什麼downvote。希望有機會解決任何錯誤 –

+0

我沒有downvoted,但也許你應該改變'if'幷包含'any',只是爲了安全,如果'tab'在另一個索引中。 – RompePC

+0

@RompePC我不這麼認爲,看起來標籤總是在索引0(如果OP澄清將會改變)。 –

5

下面是使用itertools.groupby()一個Python的方式:即不

In [10]: from itertools import groupby 

In [12]: delimiters = {'tab1', 'tab2'} 

In [13]: [list(g) for k, g in groupby(lst, delimiters.intersection) if not k] 
Out[13]: 
[[['val1', 10], ['val2', 'test'], ['val3', 20]], 
[['val4', 'test'], ['val5', 30]]] 

一個更通用的方法要求指定分隔符,使用lambda函數作爲groupby的關鍵函數(但性能較低):

In [14]: [list(g) for k, g in groupby(lst, lambda x: x[0].startswith('tab')) if not k] 
Out[14]: 
[[['val1', 10], ['val2', 'test'], ['val3', 20]], 
[['val4', 'test'], ['val5', 30]]] 
+1

華麗。當你打敗我的時候,我剛開始擺弄itertools來尋找pythonic。 –

+0

不錯。不想給你錯誤的想法,所以只是讓你知道我發現我的groupby解決方案獨立於你:)(你的更好但是) –

+0

@cᴏʟᴅsᴘᴇᴇᴅ沒問題;) – Kasramvd