python - 在循环中创建多维 python 列表
问题描述
我尝试在 python 3.7 中创建一个多维数组。不幸的是,我事先不知道变量类型、尺寸或尺寸数量。到目前为止,我的方法是一个循环:
dimensions = [3,3]
vartype = 'binary'
if vartype=='binary':
new_array=False
elif vartype=='int':
new_array=0
for dim in dimensions:
new_array = [new_array for _ in range(dim)]
问题是,如果有多个维度,我最终会多次引用第一个维度:
new_array[0][1]=True
print(new_array)
[[False, True, False],
[False, True, False],
[False, True, False]]
这已经解决了很多次,比如这里。但是在其他情况下,维度的数量是已知的,因此我无法将解决方案转移到我的问题上。有谁知道创建不同维度的数组的方法?
解决方案
当没有参数调用时,您可以使用构造函数bool
并int
返回这些数据类型的默认值,即bool() is False
和int() == 0
。
为了使任何数量的维度都通用,您可以使用一些巧妙的递归......
def make_array(dimension, element_ctor):
return [element_ctor() for x in range(dimension)]
def make_ndim_array(dimensions, element_ctor):
return make_array(
dimensions[0],
(
element_ctor
if len(dimensions) == 1
else lambda: make_ndim_array(dimensions[1:], element_ctor)
),
)
print(make_ndim_array([2, 3, 4], int))
print(make_ndim_array([3, 3], str))
输出
[[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
[['', '', ''], ['', '', ''], ['', '', '']]
由于element_ctor
可以是任何可以在没有参数的情况下调用的函数,因此您甚至可以将其用于随机数的 n 维数组...
import random
print(make_ndim_array([2, 4, 11], random.random))
推荐阅读
- ruby-on-rails - 通过分组数据过滤和映射
- bash - 调用 bind -x 命令后刷新 bash 提示符
- php - 如何使用 Laravel8 中的 Twig 扩展注入 php GraphQL 查询结果,在 Twig(Bridge) 模板中定义查询?
- mysql - 将变量传递给 DATABASE 以防止 mysql 注入节点和 mysql
- swift - 从 Firebase 实时数据库获取数据到 Tableview 单元
- html - 具有可变行高的水平“砌体”类型布局
- css - 在任何页面文本悬停时更改光标
- r - 对执行因子的函数给出条件
- html - 如何使 HTML 页面的一部分响应?
- javascript - 如何在我的网站上显示来自 facebook 的三个最新帖子?