создать многомерный список Python в цикле - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь создать многомерный массив в 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)]

Проблема в том, что если существует более 1 измерения, я получаю несколько ссылок на первое измерение:

new_array[0][1]=True
print(new_array)

[[False, True, False], 
 [False, True, False],   
 [False, True, False]]

Этобыл адресован довольно часто, как здесь . Однако в других случаях количество измерений известно, поэтому я не могу перенести решение своей проблемы. Кто-нибудь знает способ создания массивов различного количества измерений?

Ответы [ 2 ]

3 голосов
/ 05 ноября 2019

Вы можете использовать тот факт, что конструкторы для 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))

output

[[[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))
0 голосов
/ 05 ноября 2019
import copy

for dim in dimensions:
    new_array = [copy.deepcopy(new_array) for _ in range(dim)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...