12

我想初始化一个多维列表。基本上,我想要一个 10x10 的网格 - 一个包含 10 个列表的列表,每个列表包含 10 个项目。

每个列表值都应初始化为整数 0。

在单行中执行此操作的明显方法是:myList = [[0]*10]*10行不通,因为它会生成对一个列表的 10 个引用的列表,因此更改任何行中的项目会更改所有行中的项目。

我看过的文档谈到了使用[:]复制列表,但是在使用乘数时仍然不起作用:myList = [0]*10; myList = myList[:]*10myList = [[0]*10]*10.

除了创建 s 的循环myList.append()之外,是否有一种快速有效的方法来以这种方式初始化列表?

4

9 回答 9

26

您可以使用列表理解非常有效地做到这一点:

a = [[0] * number_cols for i in range(number_rows)]
于 2013-07-14T04:44:59.790 回答
12

这是...嵌套列表理解的工作!

[[0 for i in range(10)] for j in range(10)]
于 2013-07-14T04:42:33.297 回答
3

只是想我会添加一个答案,因为这个问题要求的是一般的 n 维情况,我认为还没有回答。您可以使用以下示例对任意数量的维度递归地执行此操作:

n_dims = [3, 4, 5]

empty_list = 0
for n in n_dims:
    empty_list = [empty_list] * n

>>>empty_list
>>>[[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
   [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]
于 2014-09-26T19:57:00.857 回答
0

您实际上可能需要一个数组而不是一些列表。几乎每次我看到这种“预先调整大小的嵌套列表”模式时,总觉得有些不对劲。

于 2013-07-14T05:27:53.907 回答
0

另一个解决方案是使用 NumPy 库:

import numpy as np

zero_array = np.zeros((10, 10), dtype='int')

.tolist()如有必要,可以使用该方法轻松将其转换为常规 python 列表。

于 2018-05-29T18:37:51.753 回答
0

我发现要得到你的意思,你需要你

import copy

def n_dim_list(dims, init_val):
    if not dims:
        return []
    lst = [init_val for i in range(dims[-1])]
    for d in dims[::-1][1::]:
        lst = [copy.deepcopy(lst) for i in range(d)]
return lst

其中 dims 是您想要的维度数量的长度列表,内容是每个维度中所需 nd-list 的大小。不是最优雅但清晰的,并且可以完成工作。

于 2020-09-21T14:03:42.757 回答
0

还有另一种方法,但使用OP 的拒绝方法。

import numpy as np
myList = [[0]*10]*10
myList = np.array(myList)
l=myList.tolist()
myList=l

下面的输出和测试:

>>> l
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> l[0][0]=100
>>> l
[[100, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

输出不同于预期的l[0].

虽然这不是时间效率。一个 1000X1000 的列表需要将近 7 秒,而列表理解只需要 0.0052158 秒。

于 2020-11-12T18:39:31.980 回答
0

这是一个使用递归列表推导适用于任意数量维度的函数。它不需要任何导入即可工作。

def init_list(dims, val):
    if len(dims) == 0:
        raise ValueError("Requires at least 1 dimension.")

    if len(dims) == 1:
        return [val for _ in range(dims[0])]

    return [init_list(dims[1:], val=val) for _ in range(dims[0])]

例子:

>>> init_list([3, 2, 1], val=0)
[[[0], [0]], [[0], [0]], [[0], [0]]]
于 2021-01-23T14:32:13.277 回答
-1

执行此操作的两种常见且简短的方法:

第一的:

[[0] * n] * m

第二:

[[0 for column in range(n)] for row in range(m)]
于 2018-07-09T18:23:48.067 回答