Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中选择以零分隔的子数组_Python_List_Zero_Sub Array - Fatal编程技术网

在python中选择以零分隔的子数组

在python中选择以零分隔的子数组,python,list,zero,sub-array,Python,List,Zero,Sub Array,给出如下列表: A = [18, 7, 0, 0, 0, 9, 12, 0, 0, 11, 2, 3, 3, 0, 0, 7, 8] 有没有一种简单的方法来创建子阵列,使用那些由零(或至少由NaN)分隔的元素?我是说,比如: A1 = [18, 7] A2 = [9, 12] A3 = [11, 2, 3, 3] A4 = [7, 8] 我写过: q=0 for i in range(0,len(A)): if A[i]-A[i-1] < 1: q=q+1 q

给出如下列表:

A = [18, 7, 0, 0, 0, 9, 12, 0, 0, 11, 2, 3, 3, 0, 0, 7, 8]
有没有一种简单的方法来创建子阵列,使用那些由零(或至少由NaN)分隔的元素?我是说,比如:

A1 = [18, 7]
A2 = [9, 12]
A3 = [11, 2, 3, 3]
A4 = [7, 8]
我写过:

q=0
for i in range(0,len(A)):
    if A[i]-A[i-1] < 1:
        q=q+1
q=0
对于范围(0,len(A))中的i:
如果A[i]-A[i-1]<1:
q=q+1
检索列表中存在的零数据包数。但我需要填充子数组,只要我在列表中遇到它们。。。可能是有
split
功能的东西?提前谢谢。

试试这个:

import itertools as it
A = [18, 7, 0, 0, 0, 9, 12, 0, 0, 11, 2, 3, 3, 0, 0, 7, 8]

[list(v) for k, v in it.groupby(A, lambda x: not x) if not k]
=> [[18, 7], [9, 12], [11, 2, 3, 3], [7, 8]]
试试这个:

import itertools as it
A = [18, 7, 0, 0, 0, 9, 12, 0, 0, 11, 2, 3, 3, 0, 0, 7, 8]

[list(v) for k, v in it.groupby(A, lambda x: not x) if not k]
=> [[18, 7], [9, 12], [11, 2, 3, 3], [7, 8]]

嗯,
itertools
为您提供了解决方案:
groupby(list,filter)

如果要按零分组,请从执行以下操作开始:

B = itertools.groupby(A, lambda x:x == 0)
lambda表达式“决定”哪些值应该是分隔符。您可以使用
lambda x:x==None
(例如)通过
None
s进行分隔。这将返回一个iterable对象。因此,使用列表理解,让我们对其进行迭代(每次迭代都会给出一个2值元组):

输出将类似于:

[(假,[18,7]),(真,[0]),(真,[0]),(真,[0]),…]

现在,作为分隔符的每个列表
j
都有一个i值
True
。因此,我们可以对其进行过滤:

C = [list(j) for i, j in B if not i]
现在,结果是一个二维列表:

[[18,7],[9,12],[11,2,3,3],[7,8]]

所以一个线性函数:

def splitArr():
    return [list(j) for i, j in itertools.groupby(A, lambda x:x == 0) if not i]

嗯,
itertools
为您提供了解决方案:
groupby(list,filter)

如果要按零分组,请从执行以下操作开始:

B = itertools.groupby(A, lambda x:x == 0)
lambda表达式“决定”哪些值应该是分隔符。您可以使用
lambda x:x==None
(例如)通过
None
s进行分隔。这将返回一个iterable对象。因此,使用列表理解,让我们对其进行迭代(每次迭代都会给出一个2值元组):

输出将类似于:

[(假,[18,7]),(真,[0]),(真,[0]),(真,[0]),…]

现在,作为分隔符的每个列表
j
都有一个i值
True
。因此,我们可以对其进行过滤:

C = [list(j) for i, j in B if not i]
现在,结果是一个二维列表:

[[18,7],[9,12],[11,2,3,3],[7,8]]

所以一个线性函数:

def splitArr():
    return [list(j) for i, j in itertools.groupby(A, lambda x:x == 0) if not i]
朴素的解决方案:

A = [18, 7, 0, 0, 0, 9, 12, 0, 0, 11, 2, 3, 3, 0, 0, 7, 8]
b = []
c = []
for i in A:
    if i == 0:
        if len(c):
            b.append(c)
        c = []
        continue
    c.append(i)
if len(c):
    b.append(c)
朴素的解决方案:

A = [18, 7, 0, 0, 0, 9, 12, 0, 0, 11, 2, 3, 3, 0, 0, 7, 8]
b = []
c = []
for i in A:
    if i == 0:
        if len(c):
            b.append(c)
        c = []
        continue
    c.append(i)
if len(c):
    b.append(c)

当然有办法,你试过什么吗?请给我们看看你的代码。可能重复:当然有办法,你试过什么吗?请出示您的代码。可能重复:谢谢!那正是我要找的for@urgeo不客气!希望您阅读所有内容,而不仅仅是最终解决方案;-)非常感谢。那正是我要找的for@urgeo不客气!希望您阅读所有内容,而不仅仅是最终解决方案;-)