将整数列表拆分为以0作为分隔符的子列表

时间:2019-02-18 19:21:35

标签: python list

我有以下整数列表:

l = [6, 6, 0, 5, 4, 5, 0, 0, 4, 6]

我将不得不生成以下列表,方法是使用连续的零作为分隔符拆分以上列表,以获得:

res = [[6, 6], [5, 4, 5] , [4, 6]]

2 个答案:

答案 0 :(得分:3)

您可以使用itertools.groupby来对列表中0s之间出现的元素进行分组:

from itertools import groupby
[list(v) for k,v in groupby(l, key = lambda x: x != 0) if k != 0]
# [[6, 6], [5, 4, 5], [4, 6]]

详细信息

key处的key = lambda x: x != 0自变量正在转换列表,以便将其分组为:

[x != 0 for x in l]
# [True, True, False, True, True, True, False, False, True, True]

请注意,groupby对相等的连续值进行分组。 因此,由于groupby,此密钥将产生以下值:

[list(v) for k,v in groupby(l, key = lambda x: x != 0)]
[[6, 6], [0], [5, 4, 5], [0, 0], [4, 6]]

现在,如果values不是key,我们只需要指定要保留0,这可以通过在结尾添加if k != 0来实现。列表理解。


有用的内容:

答案 1 :(得分:1)

Python具有惊人的功能,我们可以将其用于切片。 我认为这种方法比使用itertools.groupby的其他答案更容易。

代码:

l = [6, 6, 0, 5, 4, 5, 0, 0, 4, 6]
res = list(map(list, zip(l[::2], l[1::2])))
print(res)

结果:

[(6, 6), (0, 5), (4, 5), (0, 0), (4, 6)]

使用列表推导代替地图内置功能的替代方法:

res = [list(i) for i in (zip(l[::2], l[1::2]))] 

说明:

zip()函数采用可迭代对象(例如:列表,字符串,字典)或用户定义的可迭代对象,并基于可迭代对象返回元组的迭代器。

map()函数带有两个参数,第一个参数是函数的名称,第二个参数是序列(例如列表)的seq。

map()将函数应用于序列中的所有元素。

我们在这里使用它来将列表内置函数应用于zip函数的所有元组结果。

借助 slicing (切片),我们为zip函数提供了从列表中创建的两个可迭代项,一个从第一个项开始,增量为2,另一个从第二个项开始,增量也设置为2

解释此处使用的切片: l [:: 2]

  

切片时,列表具有默认功能。如果没有   在第一个冒号之前的值,表示从起始索引开始   列表中。如果在第一个冒号之后没有值,则意味着   一直到列表末尾。最后一个冒号告诉Python   我们想选择切片增量。默认情况下,Python   将此增量设置为1,但在   数字可以让我们指定我们想要的东西。

切片教程:

link

python zip函数文档:

link

python map函数文档:

link

python列表理解文档:

link