Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.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_Numpy_Nested Lists_Flatten - Fatal编程技术网

Python 如何删除不同长度列表中最内层的嵌套

Python 如何删除不同长度列表中最内层的嵌套,python,numpy,nested-lists,flatten,Python,Numpy,Nested Lists,Flatten,我试图删除单元素长度列表列表中最内层的嵌套。您是否知道一种相对简单的方法(转换为NumPy阵列很好)来获取: [[[1], [2], [3], [4], [5]], [[6], [7], [8]], [[11], [12]]] 对这个 [[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]] 另外,我尝试为其执行此操作的实际列表包含datetime对象,而不是示例中的Int。最初收集的名单长度也会有所不同 或者,如果原始列表中存在NAN,则只要输出列表中不存在NAN,则每

我试图删除单元素长度列表列表中最内层的嵌套。您是否知道一种相对简单的方法(转换为NumPy阵列很好)来获取:

[[[1], [2], [3], [4], [5]], [[6], [7], [8]], [[11], [12]]]
对这个

[[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]
另外,我尝试为其执行此操作的实际列表包含datetime对象,而不是示例中的Int。最初收集的名单长度也会有所不同

或者,如果原始列表中存在NAN,则只要输出列表中不存在NAN,则每个列表的长度都是相同的。i、 e

[[[1], [2], [3], [4], [5]], 
 [[6], [7], [8], [nan], [nan]], 
 [[11], [12], [nan], [nan], [nan]]]
为此:

[[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]
试试这个:

l = [ [ [1],[2],[3],[4],[5] ],
      [ [6],[7],[8], [None],[None]] ,
      [ [11],[12],[None],[None],[None]] ]

l = [ [x[0] for x in s if x[0] is not None] for s in l]
这不是一个非常有效的方法,因为每次调用add时它都会重建一个列表。
或者,您可以使用
sum
或简单的列表理解,如其他答案中所示。

如果嵌套总是一致的,那么这很简单:

In [2]: import itertools

In [3]: nested = [ [ [1],[2],[3],[4], [5] ], [ [6],[7],[8] ] , [ [11],[12] ] ]

In [4]: unested = [list(itertools.chain(*sub)) for sub in nested]

In [5]: unested
Out[5]: [[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]
注意,利用列表的
add
解决方案将为您提供O(n^2)性能,其中n是每个子列表中合并的子列表的数量

怎么样

从数组形状中删除一维项


但不一定是最里面的尺寸(与尺寸无关)。但您的问题指定了“列表列表”

就像您的情况一样,最里面的对象只有一个元素。您可以基于索引访问该值,而不是使用其他函数。例如:

>>> [[y[0] for y in x] for x in my_list]
[[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]
如果最里面的列表可能包含多个元素,您可以执行以下操作:

>>> [[z for y in x for z in y] for x in my_list]
[[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]

如果您知道嵌套的级别,那么列表中的一个理解就很容易了

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]]
填充确实让我们可以制作一个3d阵列,然后可以很容易地压缩:

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)      # e.g. sublist sums
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
,则数组将是object dtype,它更接近字符中的嵌套列表

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]]
另一种数组方法是在第二级计算有效元素的数量;将整个对象展平,然后
拆分

递归函数:

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的答案非常相似。

,因为这个问题看起来很有趣
我使用了一个递归函数,当列表只有一个值时,它会解压列表

def make_singular(l):
    try:
        if len(l) == 1:
            return l[0]
        else:
            return [make_singular(l_) for l_ in l]
    except:
        return l

nest = [ [ [1],[2],[3],[4], [5] ], [ [6],[7],[8] ] , [ [11],[12] ] ]
make_singular(nest)

[[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]

南斯是什么?什么类型的对象?嵌套总是一致的吗?假设您已经有一个多维numpy数组,np.squence()不是这样做的吗?在nan示例中,我使用列表扩展方法来均衡列表长度。这使我能够转换为numpy数组,并对其进行重塑,以删除最内层的嵌套。实际数据中这些列表的典型长度是多少?
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]]
def make_singular(l):
    try:
        if len(l) == 1:
            return l[0]
        else:
            return [make_singular(l_) for l_ in l]
    except:
        return l

nest = [ [ [1],[2],[3],[4], [5] ], [ [6],[7],[8] ] , [ [11],[12] ] ]
make_singular(nest)

[[1, 2, 3, 4, 5], [6, 7, 8], [11, 12]]