繁体   English   中英

如何创建多维列表

[英]How to create a multi-dimensional list

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

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

在单行中执行此操作的明显方法: myList = [[0]*10]*10将不起作用,因为它会生成一个包含 10 个对一个列表的引用的列表,因此更改任何行中的一项都会改变它行。

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

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

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

a = [[0] * number_cols for i in range(number_rows)]

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

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

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

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

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 的大小。 不是最优雅但清晰并且可以完成工作。

另一种方法,但使用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 秒。

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

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

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

第一的:

[[0] * n] * m

第二:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM