似乎无法在网上找到这个线索,也无法自己解决这个问题:
如何切片列表以便返回连续的非零整数切片列表。即:
data = [3, 7, 4, 0, 1, 3, 7]
我想制作:
slices = [[3, 7, 4], [1, 3, 7]]
我已经尝试了各种迭代列表的方法,一直倾向于生成器让我知道当连续组开始和停止时,通过测试前后是否有0,但后来我有点难过
答案 0 :(得分:12)
import itertools
[ list(x[1]) for x in itertools.groupby(data, lambda x: x == 0) if not x[0] ]
答案 1 :(得分:5)
>>> data = [3, 7, 4, 0, 1, 3, 7, 4, 0, 5]
>>> a=[list(i[1]) for i in itertools.groupby(data, key=lambda i:i==0)]
>>> a
[[3, 7, 4], [0], [1, 3, 7, 4], [0], [5]]
>>> [i for i in a if i != [0]]
[[3, 7, 4], [1, 3, 7, 4], [5]]
答案 2 :(得分:3)
def split_on_zero(data):
start = 0
for (i, n) in enumerate(data):
if n == 0:
yield data[start:i]
start = i + 1
yield data[start:]
>>> list(split_on_zero([3, 7, 4, 0, 1, 3, 7]))
[[3, 7, 4], [1, 3, 7]]
>>> list(split_on_zero([0, 1, 2, 0, 3, 4, 5, 0]))
[[], [1, 2], [3, 4, 5], []]
答案 3 :(得分:1)
这里也是你可以尝试使用的基础解决方案:
data = [1, 0, 3, 7, 4, 1, 3, 7]
def get_zero_sliced(inputList):
res = []
prev = 0
for i,x in enumerate(data):
if x == 0 and i != 0:
res.append(data[prev:i])
prev = i + 1
if i == len(data)-1 and prev != i:
res.append(data[prev:])
return res
get_zero_sliced(data)
答案 4 :(得分:0)
发电机可以工作。这是一个,但可能有其他方法可以做到这一点。我称之为x
,因为我现在没有一个好名字(好的命名需要一些思考,所以请考虑一下)。
def x(iterator):
result = []
for i in iterator:
if i != 0:
result.append(i)
elif result:
yield result
result = []
if result: yield result