我有以下整数列表:
l = [6, 6, 0, 5, 4, 5, 0, 0, 4, 6]
我将不得不生成以下列表,方法是使用连续的零作为分隔符拆分以上列表,以获得:
res = [[6, 6], [5, 4, 5] , [4, 6]]
答案 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,但在 数字可以让我们指定我们想要的东西。
切片教程:
python zip函数文档:
python map函数文档:
python列表理解文档: