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

Python 将整数列表拆分为以0为分隔符的子列表,python,list,Python,List,我有一个整数列表: l = [6, 6, 0, 5, 4, 5, 0, 0, 4, 6] 我必须通过使用连续零作为分隔符拆分上述列表来生成以下列表,以便获得: res = [[6, 6], [5, 4, 5] , [4, 6]] 您可以使用将列表中出现在0s之间的元素分组: from itertools import groupby [list(v) for k,v in groupby(l, key = lambda x: x != 0) if k != 0] # [[6, 6], [5,

我有一个整数列表:

l = [6, 6, 0, 5, 4, 5, 0, 0, 4, 6]
我必须通过使用连续零作为分隔符拆分上述列表来生成以下列表,以便获得:

res = [[6, 6], [5, 4, 5] , [4, 6]]
您可以使用将列表中出现在
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]]
现在,我们只需指定如果
不是
0
,我们希望保留
值,这可以通过添加
如果k!=列表末尾的0


有用的内容如下:


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]))] 
结果:

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]))] 
使用列表理解代替映射内置函数的替代方法:

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]))] 
说明:

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()函数获取iterables(如:list、string、dict)或用户定义的iterables,并基于iterable对象返回元组迭代器

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

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

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

借助于切片,我们为zip函数提供了两个从列表中生成的iterables,一个从第一项开始,增量为2,另一个从第二项开始,增量也设置为2

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

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

切片教程:

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

python zip函数文档:

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

python映射函数文档:

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

python列表理解文档:

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

欢迎来到StackOverflow。此问题缺少上下文或其他细节:请提供额外的上下文来改进问题,其中最好包括您对问题的想法以及您为解决问题所做的任何尝试。这些信息有助于其他人识别您遇到的困难,并帮助他们写出适合您经验水平的答案。你还需要准确地说明你的困难是什么,你期望什么,你得到了什么,以及任何回溯。谢谢!我开始学习python,这种语法对我来说仍然很难!我会尽快检查答案!你好,马可,补充了一些解释。希望现在更清楚了。如果你有任何疑问,请告诉我这很聪明。即使像我这样的非初学者也要看两遍才能理解它。一个可能有帮助的见解是,如果
key=lambda x:x==0,它也可以工作!是的,这是正确的@BarryRogerson重点是通过一些独特的键对元素进行分组。谢谢:)@yatu我认为我在回答中展示的方法更简单、更简洁,使用python切片和zip()内置func,无需加载任何模块。检查一下,如果你同意,请告诉我。最后,您的代码可以按预期正常工作。干得好