【问题标题】:Restructure nested python lists重构嵌套的python列表
【发布时间】:2018-08-20 09:26:36
【问题描述】:

假设我们有一个包含 3 层(D1=2,D2=3,M=2)的嵌套列表,例如:

l = [[[1,a],[2,b],[3,c]], [[4,d],[5,e],[6,f]]]

我试图弄清楚是否有任何 python 方法来构建 2 个具有 2 个级别(D1=2,D2=3)的新嵌套列表,例如:

l1 = [[1,2,3], [4,5,6]]
l2 = [[a,b,c], [d,e,f]]

那么我们可能有 N 层,最深层的列表包含 M 个元素 (D1,D2,D3, ..., D_N-1,M),目标总是构建嵌套的 M 个包含 N-1 的列表水平。

换句话说,我们需要通过拆分较低级别来保留层次结构。

其他例子:

l = [[[[13076, 0, 0], [806, 0, 0]], [[13076, 0, 0], [2, 0, 0]]]], [[[[2066, 0, 0], [8, 0, 0]], [[42, 0, 0], [4147, 0, 0]]]]

l1 = [[[13076,806], [13076,2]], [[2066,8],[42,4147]]]
l2 = [[[0,0], [0,0]], [[0,0], [0,0]]]
l3 = [[[0,0], [0,0]], [[0,0], [0,0]]]

【问题讨论】:

    标签: python nested-lists


    【解决方案1】:

    numpy 语法对于这个任务很方便:

    import numpy as np
    
    l = [[[1, 'a'], [2, 'b'], [3, 'c']],
         [[4, 'd'], [5, 'e'], [6, 'f']]]
    
    a = np.array(l)
    
    l1 = a[:, :, 0].astype(int).tolist()
    
    # [[1, 2, 3], [4, 5, 6]]
    
    l2 = a[:, :, 1].tolist()
    
    # [['a', 'b', 'c'], ['d', 'e', 'f']]
    

    【讨论】:

    • 任何不暗示嵌套深度知识的解决方案?
    【解决方案2】:

    你只需这样做:

    l1=[[i[0] for i in j] for j in l]
    l2=[[i[1] for i in j] for j in l]
    

    【讨论】:

    【解决方案3】:

    对于任意深度,可以使用递归:

    def transpose(s):
      return list(map(list, zip(*[list(map(list, zip(*i))) if all(all(not isinstance(c, list) for c in h) for h in i) else transpose(i) for i in s])))
    
    l = [[[[13076, 0, 0], [806, 0, 0]], [[13076, 0, 0], [2, 0, 0]]]], [[[[2066, 0, 0], [8, 0, 0]], [[42, 0, 0], [4147, 0, 0]]]]
    l2 = [[[1,'a'],[2,'b'],[3,'c']], [[4,'d'],[5,'e'],[6,'f']]] 
    new_data1 = {'l{}'.format(i):a for i, a in enumerate(transpose(l), start=1)}
    new_data2 = {'l{}'.format(i):a for i, a in enumerate(transpose(l2), start=1)}
    

    输出:

    {'l2': [[[[0, 0], [0, 0]]], [[[0, 0], [0, 0]]]], 'l3': [[[[0, 0], [0, 0]]], [[[0, 0], [0, 0]]]], 'l1': [[[[13076, 806], [13076, 2]]], [[[2066, 8], [42, 4147]]]]}
    
    {'l2': [['a', 'b', 'c'], ['d', 'e', 'f']], 'l1': [[1, 2, 3], [4, 5, 6]]}
    

    【讨论】:

    • 谢谢,但在这里你暗示了内部列表元素的类型,并且输出也是混合的......
    • @kiddo type(c) in [int, str] 暗示内部元素可以是整数或字符串。你能发布一个你更深层次的嵌套数据是什么样子的样本吗?
    • 目前只有整数,我只是想知道这是否可以扩展到任何类型...是否可以修复问题中的输出?这些列表实际上表示需要馈送到神经网络的输入特征,这意味着我们需要馈送三个并行列表,以便嵌入这些引用同一数据点的不同特征......
    • @kiddo 请看我最近的编辑。我更改了解决方案以支持任意类型的值。
    • 太好了,我们可以有这种形式的输出吗? l1 = [[1,2,3], [4,5,6]] l2 = [[a,b,c], [d,e,f]]
    【解决方案4】:

    在地图中使用地图

    l = [[[1,"a"],[2,"b"],[3,"c"]], [[4,"d"],[5,"e"],[6,"f"]]]
    l1 = list(map(lambda x: list(map(lambda y: y[0], x)), l))
    l2 = list(map(lambda x: list(map(lambda y: y[1], x)), l))
    

    【讨论】:

    • 任何不暗示嵌套深度知识的解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多