Список в матрицу смешанных измерений

1

Я пытался выяснить, как взять список и соответствовать форме любого матрица.

a = [1,2,3,4,5,6,7,8,9]
b = [[3],[[2]],[1,8,2],[[[7,3,2]]],[9]]

Я хочу, чтобы список a соответствовал размерам матрицы b. И a, и b имеют одинаковое количество отдельных элементов. Функция требует a и должна иметь одинаковое количество элементов.

output = [[1],[[2]],[3,4,5],[[[[6,7,8]],[9]]

Мой приступ пытается это сделать.

import numpy as np
lst = []
start = 0
def match_matrix(a,b):
    for k, v in enumerate(b):
        shape = np.shape(v)
        lst.append(np.reshape(a[start:start+element_num], newshape= shape) # there problem is here, how would I figure out how many elements in any dimension matrix
         start += element_num

    return lst
  • 3
    Не уверен, что NumPy - лучшее решение, поскольку у вас нет обычного массива с n- мерным размером, поскольку ваш массив неровный. Вложенные списки могут быть лучше.
Теги:
arrays
numpy
list
python-3.x

2 ответа

2

Не уверен, почему вы хотите использовать numpy для этого. Вот простое решение для создания списка списков

>>> a = [1,2,3,4,5,6,7,8,9]
>>> b = [[3],[[2]],[1,8,2],[[[7,3,2]]],[9]]
>>> 
>>> def create_list(l, itr):
...     return [create_list(e, itr) if isinstance(e, list) else next(itr) for e in l]
... 
>>> 
>>> create_list(b, iter(a))
[[1], [[2]], [3, 4, 5], [[[6, 7, 8]]], [9]]
  • 1
    Не называйте лямбды . Просто сделай это функцией. Это сделает его намного более читабельным всегда
  • 0
    Верно .. Обновил ответ
1

Это можно сделать прямо с рекурсией. Эта функция предполагает, что список b имеет такое же количество элементов списка, что и длина списка a

def match_matrix(a, b):
    it = iter(a)
    def _worker(b):
        lst = []
        for x in b:
            if isinstance(x, list):
                lst.append(_worker(x))
            else:
                lst.append(next(it))
        return lst
    return _worker(b)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню