繁体   English   中英

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

[英]How to slice list into contiguous groups of non-zero integers in Python

似乎无法在网上找到线索,也无法自己弄清楚:

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

data = [3, 7, 4, 0, 1, 3, 7]

我想制作:

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

我尝试了各种迭代列表的方法,一直倾向于使用生成器,通过测试之前或之后是否有 0,让我知道连续组何时开始和停止,但后来我有点难过。

import itertools
[ list(x[1]) for x in itertools.groupby(data, lambda x: x == 0) if not x[0] ]

查看itertools.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]]
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)

发电机将工作。 这是一个,但可能还有其他方法可以做到这一点。 我称它为x是因为我现在没有一个好名字(好名字需要一些思考,所以请考虑一下)。

def x(iterator):
    result = []
    for i in iterator:
        if i != 0:
            result.append(i)
        elif result:
            yield result
            result = []
    if result: yield result

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM