重构嵌套的python列表

时间:2018-03-12 11:16:08

标签: python nested-lists

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

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

我试图找出是否有任何pythonic方法来构建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),目标始终是用N-1构建嵌套的M列表水平。

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

其他例子:

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]]]

4 个答案:

答案 0 :(得分:2)

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']]

答案 1 :(得分:2)

你只需:

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

答案 2 :(得分:0)

在地图中使用地图

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))

答案 3 :(得分:0)

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

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]]}