给出如下列表:
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
函数的东西?提前谢谢。
答案 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)