Python:初始化多维列表

时间:2013-07-14 04:40:36

标签: python list

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

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

在单行中执行此操作的显而易见的方法:myList = [[0]*10]*10将无效,因为它会生成一个包含10个对一个列表的引用的列表,因此更改任何行中的项目会在所有行中更改它。 / p>

我见过的文档讨论了如何使用[:]复制列表,但在使用乘数时仍然无效:myList = [0]*10; myList = myList[:]*10myList = [[0]*10]*10具有相同的效果。

如果没有创建myList.append() s的循环,有没有一种快速有效的方法来以这种方式初始化列表?

9 个答案:

答案 0 :(得分:22)

使用list comprehension

可以非常有效地完成
a = [[0] * number_cols for i in range(number_rows)]

答案 1 :(得分:10)

这是...嵌套list comprehension的作业!

[[0 for i in range(10)] for j in range(10)]

答案 2 :(得分:2)

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

答案 3 :(得分:0)

您实际上可能需要array而不是某些列表。几乎每当我看到这种“预定的嵌套列表”模式时,事情就不太对了。

答案 4 :(得分:0)

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

import numpy as np

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

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

答案 5 :(得分:0)

两种常见的简短方法:

第一

[[0] * n] * m

第二:

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

答案 6 :(得分: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的大小。 不是最优雅,但最清晰,可以完成工作。

答案 7 :(得分: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秒。

答案 8 :(得分: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]]]