Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建多维列表_Python_List - Fatal编程技术网

Python 如何创建多维列表

Python 如何创建多维列表,python,list,Python,List,我想初始化一个多维列表。基本上,我想要一个10x10的网格——一个包含10个列表的列表,每个列表包含10个项目 每个列表值应初始化为整数0 在一行中实现这一点的明显方法是:myList=[[0]*10]*10,它无法工作,因为它会生成一个列表,其中包含对一个列表的10个引用,因此更改任何行中的项都会更改所有行中的项 我看到的文档谈到了使用[:]复制列表,但在使用乘法器时仍然不起作用:myList=[0]*10;myList=myList[:]*10与myList=[[0]*10]*10具有相同的

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

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

在一行中实现这一点的明显方法是:
myList=[[0]*10]*10
,它无法工作,因为它会生成一个列表,其中包含对一个列表的10个引用,因此更改任何行中的项都会更改所有行中的项

我看到的文档谈到了使用
[:]
复制列表,但在使用乘法器时仍然不起作用:
myList=[0]*10;myList=myList[:]*10
与myList=[[0]*10]*10具有相同的效果


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

这是一个嵌套的任务


您可以通过以下方式非常高效地完成此任务:


实际上,您可能需要一个列表,而不是一些列表。几乎每次我看到这种“预先确定的嵌套列表”模式时,都会发现有些地方不太正确。

我只是想添加一个答案,因为这个问题是针对一般的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]]]

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

import numpy as np

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

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

实现此目的的两种常见方法:

第一名:

[[0] * n] * m
[[0 for column in range(n)] for row in range(m)]
秒:

[[0] * n] * m
[[0 for column in range(n)] for row in range(m)]

我发现要明白你的意思,你需要

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列表的大小。
不是最优雅但清晰的方法。还有另一种方法,但使用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秒,而as列表理解只需要0.0052158秒。

这里有一个函数,它使用递归列表理解来处理任意数量的维度。它不需要任何导入就可以工作

def初始列表(dims,val):
如果len(dims)==0:
raise VALUE ERROR(“至少需要1个维度”)
如果len(dims)==1:
返回范围内uu的[val(dims[0])]
返回范围内(dims[0])的[init_列表(dims[1:],val=val)]
例如:

>>> init_list([3, 2, 1], val=0)
[[[0], [0]], [[0], [0]], [[0], [0]]]

我认为
[:]
的想法也可以奏效,例如[[0]*10]*10]中的
[x[:]for x。请参阅以了解为什么
[[0]*10]*10
不能按预期工作。很好,避免了明显答案所具有的嵌套for循环,但只有在您希望数组初始化的值可以多次引用的情况下才起作用,因此,如果希望用类的唯一实例填充数组,则不需要这样做。请注意,现在可以使用类似数组的语法访问数据:
a[col\u num][row\u num]
我没有进行更改。刚刚编辑过,因为这是表示矩阵更自然的方式。@Alex,你说得对。首先对外部列表进行索引。这与问题中描述的问题相同-它会创建对同一列表的许多引用。我认为这比其他方法更清楚,而且通常更可取(例如使用
[0]*10
)。如果列表元素是可变对象,则这是正确的解决方案。1000X1000所用的时间为0.00521秒