每次列表中的零为零时,创建一个新的前面字符子列表,不包括零

Ben*_*eff 3 python grouping list sublist

我必须操作的列表更长,但是例如让我们使用一个列表 [3,5,0,6,8,9,7,0,1,0].零之间的元素数量不是恒定的.我想将零之前的术语分组到子列表中.我正在寻找的是[[3,5],[6,8,9,7],[1]]; 零分割条款但不包括在子列表中.

我不认为我可以使用该split功能,因为我正在对元素进行分组,所以我一直试图找出一种以这种方式分组的方法.

jam*_*lak 6

>>> from itertools import groupby
>>> L = [3,5,0,6,8,9,7,0,1,0]
>>> [list(g) for k, g in groupby(L, key=bool) if k]
[[3, 5], [6, 8, 9, 7], [1]]
Run Code Online (Sandbox Code Playgroud)

key=bool在这种情况下工作,因为0被认为是空的,但正如@AshwiniChaudhary所指出的那样,key当你没有分裂时,你将不得不使用自定义函数0.分裂2

key=lambda x: x != 2
Run Code Online (Sandbox Code Playgroud)

说明:

首先,我将说明key工作原理:

>>> bool(3), bool(5)
(True, True)
>>> bool(0)
False
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,或者返回True或者False,False0True对其他任何东西.(其实bool('')bool([])还回False,以及任何其他空的内置对象,但我们只在这里考虑的数字)

所以groupby简单地将key函数的结果分组,因此分组为0s和1s.

>>> [(key, group) for key, group in groupby(L, key=bool)]
[(True, <itertools._grouper object at 0xb6fc1dac>), (False, <itertools._grouper object at 0xb6fc432c>), (True, <itertools._grouper object at 0xb6fc422c>), (False, <itertools._grouper object at 0xb6fc4c2c>), (True, <itertools._grouper object at 0xb6fc428c>), (False, <itertools._grouper object at 0xb6fc476c>)]
Run Code Online (Sandbox Code Playgroud)

但是你可以看到这个组,是一个奇怪的对象,一个itertools._grouper对象.为什么不返回列表呢?itertools在分组项目懒洋洋这是更为有效的,但离开的工作,我们的消费群中的所有项目成list.

>>> [(key, list(group)) for key, group in groupby(L, key=bool)]
[(True, [3, 5]), (False, [0]), (True, [6, 8, 9, 7]), (False, [0]), (True, [1]), (False, [0])]
Run Code Online (Sandbox Code Playgroud)

但是我们不需要它key,我们只需要检查它是否True只返回满足这个谓词的项目,从而在开始时得到我的答案.

>>> [list(group) for key, group in groupby(L, key=bool) if key]
[[3, 5], [6, 8, 9, 7], [1]]
Run Code Online (Sandbox Code Playgroud)

  • +1更好地使用`key = lambda x:x!= 0`,因为它允许你分割任何元素. (2认同)