Добавить элемент в список списков, когда все размеры всех списков неизвестны в python - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь написать код Python, который организует n-мерные данные в бункеры.

Для этого я инициализирую список пустых списков, используя следующую функцию, которая принимает в качестве аргумента массив с количеством бинов для каждого измерения:

def empties(b):

    invB = np.flip(b, axis=0)
    empty = []
    for b in invB:
        build = deepcopy(empty)
        empty = []
        for i in range(0,b):
            empty.append(build)

    return np.array(empty).tolist() # workaround to clear list references

Например, для двумерных данных с 3 ячейками вдоль каждого измерения следует ожидать следующее:

Введите:

empties([3,3])

Выход:

[ [[],[],[]], [[],[],[]], [[],[],[]] ]

Я бы хотел добавить объекты в этот список списков. Это легко, если размеры известны. Если бы я хотел добавить объект в приведенный выше список в позиции (1,2), я мог бы использовать:

bins = empties([3,3])

obj = Object()
bins[1][2].append(obj)

Однако я хочу, чтобы это работало для любого неизвестного числа измерений и количества ячеек. Поэтому я не могу использовать нотацию «[] [] [] ...» для определения индекса списка. Списки не принимают списки или кортежи для индекса, поэтому это не вариант. Кроме того, я не могу использовать массив NumPy, потому что все списки могут быть разной длины.

Есть ли какое-либо решение о том, как установить элемент списка на основе динамического числа индексов?

В идеале, если списки могут принимать список в качестве индекса, я бы сделал это:

idx = some_function_that_gets_bin_numbers()

bins[idx].append(obj)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы можете применять итерационные индексы к вложенному массиву следующим образом:

reduce((lambda a, e: a[e]), index_list, nested_list)

, если nested_list = [0, 1, [[[2], [3]], 4], 5], и index_list = [2, 0, 1], приведенная выше строка вернет [3].

0 голосов
/ 08 ноября 2018

Я имею в виду ... Вы можете реализовать пользовательский __getitem__ для пользовательского класса (как это делает numpy)

но при условии, что вы не можете, что-то вроде:

def append_md(lst, idx, value):
    for i in idx:
        lst = lst[i]
    lst.append(value)

append_md(bins, idx, obj)

должен сделать трюк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...