如果您知道嵌套的层数,那么其中一个列表推导式就很容易。
In [129]: ll=[ [ [1],[2],[3],[4], [5] ], [ [6],[7],[8] ] , [ [11],[12] ] ]
In [130]: [[j[0] for j in i] for i in ll] # simplest
Out[130]: [[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]
如果准则只是要移除嵌套的内层,不管它发生多深,代码将需要更多的思考。我可能会尝试将其编写为一个递归函数。
np.nan
(或None
)填充对于列表版本没有帮助。
In [131]: lln=[ [ [1],[2],[3],[4],[5] ], [ [6],[7],[8],[nan],[nan]] , [ [11],[12],[nan],[nan],[nan] ] ]
In [132]: [[j[0] for j in i if j[0] is not np.nan] for i in lln]
Out[132]: [[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]
填充使我们能够创建一个三维数组,然后可以轻松地压缩:
In [135]: arr = np.array(lln)
In [136]: arr.shape
Out[136]: (3, 5, 1)
In [137]: arr = arr[:,:,0]
In [138]: arr
Out[138]:
array([[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., nan, nan],
[ 11., 12., nan, nan, nan]])
但接下来有一个问题,如何去除那些nan
并创建不规则子列表。
掩码数组可以让你在处理2D数组时不受这些 nan
的干扰:
In [141]: M = np.ma.masked_invalid(arr)
In [142]: M
Out[142]:
masked_array(data =
[[1.0 2.0 3.0 4.0 5.0]
[6.0 7.0 8.0 -- --]
[11.0 12.0 -- -- --]],
mask =
[[False False False False False]
[False False False True True]
[False False True True True]],
fill_value = 1e+20)
In [144]: M.sum(axis=1)
Out[144]:
masked_array(data = [15.0 21.0 23.0],
mask = [False False False],
fill_value = 1e+20)
从
arr
中移除
nan
可能最容易的方法是使用列表推导式。这些值是浮点数,因为
np.nan
是浮点数。
In [153]: [[i for i in row if ~np.isnan(i)] for row in arr]
Out[153]: [[1.0, 2.0, 3.0, 4.0, 5.0], [6.0, 7.0, 8.0], [11.0, 12.0]]
所以填充没有帮助。
如果填充是None
,那么数组将是对象数据类型,更接近于字符中的嵌套列表。
In [163]: lln
Out[163]:
[[[1], [2], [3], [4], [5]],
[[6], [7], [8], [None], [None]],
[[11], [12], [None], [None], [None]]]
In [164]: arr=np.array(lln)[:,:,0]
In [165]: arr
Out[165]:
array([[1, 2, 3, 4, 5],
[6, 7, 8, None, None],
[11, 12, None, None, None]], dtype=object)
In [166]: [[i for i in row if i is not None] for row in arr]
Out[166]: [[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]
另一种数组方法是计算第二级别的有效元素数量;将整个数组展平,然后使用split
函数。
一个递归函数:
def foo(alist):
if len(alist)==1:
return alist[0]
else:
return [foo(i) for i in alist if foo(i) is not None]
In [200]: ll=[ [ [1],[2],[3],[4], [5] ], [ [6],[7],[8] ] , [11], [[[12],[13]]]]
In [201]: foo(ll)
Out[201]: [[1, 2, 3, 4, 5], [6, 7, 8], 11, [[12], [13]]]
In [202]: lln=[ [ [1],[2],[3],[4],[5] ], [ [6],[7],[8],[None],[None]] , [ [11],[12],[None],[None],[None] ] ]
In [203]: foo(lln)
Out[203]: [[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]
它递归到列表长度为1的级别。 它仍然很脆弱,如果嵌套级别不同则会出现问题。 从概念上讲,它与@piRSquared
的答案非常相似。