首页 > 解决方案 > 在循环中创建多维 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]]

这已经解决了很多次,比如这里。但是在其他情况下,维度的数量是已知的,因此我无法将解决方案转移到我的问题上。有谁知道创建不同维度的数组的方法?

标签: pythonlist

解决方案


当没有参数调用时,您可以使用构造函数boolint返回这些数据类型的默认值,即bool() is Falseint() == 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))

推荐阅读