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

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

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

最佳答案

>>> 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]]

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

key=lambda x: x != 2

说明:

首先,我将说明密钥的工作原理:

>>> bool(3), bool(5)
(True, True)
>>> bool(0)
False

如您所见,它将返回True或False,False返回0,True返回其他任何内容. (实际上bool(”)和bool([])也返回False,以及任何其他空的内置对象,但我们只考虑数字)

因此groupby只是将关键函数的结果分组,因此分组为0和1.

>>> [(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>)]

但是你可以看到这个组是一个奇怪的对象,一个itertools._grouper对象.为什么不返回列表呢? itertools正在懒惰地对项目进行分组,效率要高得多,但这使得我们可以将组中的所有项目都使用到列表中.

>>> [(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])]

但是我们不需要密钥,我们只需要检查它是否为True并且只返回满足该谓词的项目,这会在开始时得到我的答案.

>>> [list(group) for key, group in groupby(L, key=bool) if key]
[[3, 5], [6, 8, 9, 7], [1]]
点赞