如何从一维列表或数组初始化子列表的子列表列表



我有一个函数可以创建列表列表:

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列表的列表,其中第一个是长度为n+1h列表的列表并且第二个是长度h+1o列表的列表。此函数将最深列表的每个元素初始化为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。该1D列表的长度为(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将是我想要初始化列表的确切数字。

我最好的想法是制作一个生成器并生成值(不是initialize_master_list中的0 for i in range...,而是next(generator) for i in range...,但这很难看。我希望有一种更简单的方法,而不是像那样把它组合在一起。

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

您可以创建一个由值列表播种的生成器,并使用它来填充列表:

def initialize_master_list(n, h, o, l):
master_list = []
seeds = val_generator(l)
master_list.append([[next(seeds) for i in range(n+1)] for j in range(h)])
master_list.append([[next(seeds) for i in range(h+1)] for j in range(o)])
return master_list
def val_generator(l):
for val in l:
yield val

如果您希望将任何自定义逻辑作为生成器的一部分,那么这种方法可能是可取的。

最新更新