如何在Python中将列表分割成连续的非零整数组

如何在Python中将列表分割成连续的非零整数组,python,Python,似乎在网上找不到线索,自己也找不到,所以: 我将如何对列表进行切片,以便返回连续非零整数的切片列表。即: data = [3, 7, 4, 0, 1, 3, 7] 我想制作: slices = [[3, 7, 4], [1, 3, 7]] 我尝试了各种迭代列表的方法,一直倾向于使用一个生成器,通过测试前后是否有0,可以让我知道相邻组何时开始和停止,但我有点困惑。生成器可以工作。这里有一个,但可能还有其他方法。我称它为x,因为我现在没有一个好名字(好的名字需要一些思考,所以给它一些思考) de

似乎在网上找不到线索,自己也找不到,所以:

我将如何对列表进行切片,以便返回连续非零整数的切片列表。即:

data = [3, 7, 4, 0, 1, 3, 7]
我想制作:

slices = [[3, 7, 4], [1, 3, 7]]

我尝试了各种迭代列表的方法,一直倾向于使用一个生成器,通过测试前后是否有0,可以让我知道相邻组何时开始和停止,但我有点困惑。

生成器可以工作。这里有一个,但可能还有其他方法。我称它为
x
,因为我现在没有一个好名字(好的名字需要一些思考,所以给它一些思考)

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


以下是您可以尝试使用的基本解决方案:

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)

最终产量没有看到
i
。它应该是
产生数据[start:][
。如果数组以0开始/结束,这将在连续0之间返回[]元素。@Jan:捕捉得好!实际上,您的分析是不正确的:变量在for循环之后可见。但你是对的,这是没有必要的。我将不得不读一段时间来理解到底发生了什么,但它工作完美,令人惊讶的简洁!我想我已经知道了…itertools.groupby生成的grouper对象在数据中满足lambda x:x==0的条件时进行切片,如果不满足,则x[0]会过滤掉所有未满足的对象。对吗?差不多了。每当键值(由lambda返回)更改时(因此在本例中,如果存在连续的零,它将对它们进行分组),groupby切片过早优化(检查它是否包含零),既没有保证(您被告知这是最常见的情况吗?没有?所以不要对其进行优化!),也可能没有实际的帮助(因为您需要额外的通行证)。相关:
>>> 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]]
import itertools
[ list(x[1]) for x in itertools.groupby(data, lambda x: x == 0) if not x[0] ]
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)