0

给定一个类似的列表:

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功能?先感谢您。

4

3 回答 3

3

好吧,itertools有适合你的解决方案:groupby(list, filter).

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

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

lambda 表达式“决定”哪些值应该是分隔符。None您可以使用 s分隔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作为分隔符的每个列表都有Truei 的值。所以我们可以过滤它:

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]
于 2016-08-01T16:19:58.613 回答
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]]
于 2016-08-01T16:17:09.843 回答
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)
于 2016-08-01T16:26:28.620 回答