选择python

时间:2016-08-01 16:07:14

标签: 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

检索列表中存在的零个数据包的数量。但是我需要填充子数组,只要我通过列表遇到它们......也许是split函数的东西?提前谢谢。

3 个答案:

答案 0 :(得分:3)

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

如果您想按零分组,请从执行操作开始:

B = itertools.groupby(A, lambda x:x == 0)

lambda表达式&#34;决定&#34;哪个值应该是分隔符。您可以使用None(例如)将lambda x: x == None分开。这将返回一个可迭代的对象。因此,使用列表推导,让我们迭代它(每次迭代都给我们一个2值元组):

C = [(i, list(j)) for i, j in B] # j is cast to a list because it's originally an object, not a list.

输出类似于:

  

[(False, [18, 7]), (True, [0]), (True, [0]), (True, [0]), ... ]

现在,作为分隔符的每个列表j对于i都具有值True。所以我们可以过滤它:

C = [list(j) for i, j in B if not i]

现在,结果是一个2d列表:

  

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

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:0)

天真的解决方案:

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)