将平面列表有效地分成多级嵌套列表

时间:2017-09-08 10:14:49

标签: python python-3.x nested-lists

例如,我有一个单一的列表

 [1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G']

我想将其转换为4深列表

[[[[1, 2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 'A'], ['B', 'C']], [['D', 'E'] ['F', 'G']]]]

有没有办法在不为每个级别创建单独的变量的情况下执行此操作?什么是最有记忆和性能的方式?

更新 另外,有没有办法以非对称的方式做到这一点?

[[[[1, 2, 3], 4], [[5, 6, 7], 8]]], [[[9, 'A', 'B'], 'C']], [['D', 'E', 'F'], 'G']]]]

1 个答案:

答案 0 :(得分:2)

请注意,您的第一个列表包含15个元素而不是16个。此外,A应该是什么?你是否已经在其他地方定义了一个常数?我只是假设它是一个字符串:'A'

如果您使用np.arrays,则只需reshape您的数组:

import numpy as np
r = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G'])
r.reshape(2,2,2,2)

输出:

array([[[['1', '2'],
         ['3', '4']],

        [['5', '6'],
         ['7', '8']]]


       [[['9', 'A'],
         ['B', 'C']],

        [['D', 'E'],
         ['F', 'G']]]
      dtype='<U11')

这应该非常有效,因为numpy不会更改基础数据格式。它仍然是一个平面阵列,显示不同。

Numpy不支持不规则形状。您必须使用标准的python列表:

i = iter([1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G'])

l1 = []

for _ in range(2):
    l2 = []
    for _ in range(2):
        l3 = []
        l4 = []
        for _ in range(3):
            l4.append(next(i))
        l3.append(l4)
        l3.append(next(i))
        l2.append(l3)
    l1.append(l2)

print(l1)
# [[[[1, 2, 3], 4], [[5, 6, 7], 8]], [[[9, 'A', 'B'], 'C'], [['D', 'E', 'F'], 'G']]]

正如您所说,您必须为每个级别定义一个临时变量。我想你可以使用列表推导,但它们不会很漂亮。