Python剪切列表由某个单词组成

Man*_*nti 3 python list

我有一个这样的列表:

[["tab1", None], ["val1", 10], ["val2", "test"], ["val3", 20], ["tab2", None], ["val4", "test"], ["val5", 30]]
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个方法,如果找到单词"tab",切入n个列表,结果可能是这样的:

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

list2 = [["val4", "test"], ["val5", 30]]
Run Code Online (Sandbox Code Playgroud)

我尝试了一些循环但没有做.

但是我不知道如何用python实现这一点.有人有想法吗?

提前致谢

cs9*_*s95 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]]]
Run Code Online (Sandbox Code Playgroud)

可能有一个较短的解决方案,但我怀疑它是一个更好的解决方案.

编辑:找到一个较短的版本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]]]
Run Code Online (Sandbox Code Playgroud)


Kas*_*mvd 5

这是一种pythonic方式使用itertools.groupby():

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]]]
Run Code Online (Sandbox Code Playgroud)

一种不需要指定分隔符的更通用的方法是使用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]]]
Run Code Online (Sandbox Code Playgroud)