我有一个这样的清单:
[["tab1", None], ["val1", 10], ["val2", "test"], ["val3", 20], ["tab2", None], ["val4", "test"], ["val5", 30]]
我正在寻找一种切入n个列表的方法,如果单词" tab"找到了,结果可能就是这样:
list1 = [["val1", 10], ["val2", "test"], ["val3", 20]]
list2 = [["val4", "test"], ["val5", 30]]
我尝试了一些循环但没有做任何事情。
但我不知道如何用python实现这一点。 有人有想法吗?
提前致谢
答案 0 :(得分: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]]]
答案 1 :(得分:5)
这是使用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]]]
一种不需要指定分隔符的更一般的方法是使用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]]]