首页 > 解决方案 > 如何从一维列表或数组初始化子列表的子列表列表?

问题描述

我有一个创建列表列表的函数:

def initialize_master_list(n, h, o):
    master_list = []
    master_list.append([[0 for i in range(n+1)] for j in range(h)])
    master_list.append([[0 for i in range(h+1)] for j in range(o)])
    return master_list

这将创建一个列表2列表,其中第一个是h长度列表的列表,n+1第二个是o长度列表的列表h+1。此函数将每个最深列表的元素初始化为0. 在这里,我打印了列表的样子:

N, H, O = 4, 3, 2
ML = initialize_master_list(N, H, O)
print(ML)

[[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0]]]

而不是0,我想将这些值初始化为来自一维列表或值数组。这个一维列表的长度(h * n+1) + (o * h+1)。对于当前示例,长度为(3 * 5) + (2 * 4) = 15 + 8 = 23.

例如:

GRAB = [round(random.uniform(1, 9),1) for _ in range((H*(N+1))+(O*(H+1)))]
print(GRAB)

[7.4, 5.7, 5.3, 7.1, 2.7, 4.3, 4.1, 7.0, 1.4, 1.4, 2.2, 3.2, 1.6, 8.4, 5.7, 2.0, 4.5, 7.8, 4.1, 5.1, 1.5, 1.6, 1.7]

我该如何初始化ML按顺序使用这些值进行初始化?

我的预期输出可能是:

ML = initialize_master_list(N, H, O, GRAB)
print(ML)

[[[7.4, 5.7, 5.3, 7.1, 2.7], [4.3, 4.1, 7.0, 1.4, 1.4], [2.2, 3.2, 1.6, 8.4, 5.7]], [[2.0, 4.5, 7.8, 4.1], [5.1, 1.5, 1.6, 1.7]]]

我怎样才能初始化这个列表结构基于N, H, O?我任意选择的那些值,它们可以是任何值,但我可以假设GRAB将是我想要初始化列表的确切数字数量。

我最好的想法是制作一个生成器并产生值(而不是0 for i in range...in initialize_master_listnext(generator) for i in range...但这是丑陋的。我希望有一种更简单的方法,不会像那样将它结合在一起。

标签: pythonpython-3.xlist

解决方案


使用iter创建一个迭代器并使用next按顺序获取每个值:

def initialize_master_list(n, h, o, g):
    it = iter(g)
    master_list = [[[next(it) for i in range(n + 1)] for j in range(h)],
                   [[next(it) for i in range(h + 1)] for j in range(o)]]
    return master_list


N, H, O = 4, 3, 2
GRAB = [7.4, 5.7, 5.3, 7.1, 2.7, 4.3, 4.1, 7.0, 1.4, 1.4, 2.2,
        3.2, 1.6, 8.4, 5.7, 2.0, 4.5, 7.8, 4.1, 5.1, 1.5, 1.6, 1.7]

result = initialize_master_list(N, H, O, GRAB)

print(result)

输出

[[[7.4, 5.7, 5.3, 7.1, 2.7], [4.3, 4.1, 7.0, 1.4, 1.4], [2.2, 3.2, 1.6, 8.4, 5.7]], [[2.0, 4.5, 7.8, 4.1], [5.1, 1.5, 1.6, 1.7]]]

推荐阅读