Предположим, у меня есть такой ввод:
bl = [[0,1,2,3,4,5], [6,7,8,9], [10,11,12,13]]
idx = [10, 6, 3, 4, 9, 2]
и я хочу, чтобы вывод был таким:
out = [[3,4,2], [6,9], [10]]
Логика такова:
сначала я могу просмотреть lb_cat
как некоторую составную версию:
lb_cat = [0,1,2,3,4,5,6,7,8,9,10,11,12,13]
Затем индекс из объединенного списка:
pick = lb_cat[idx] = [10, 6, 3, 4, 9, 2]
Наконец, назначенные элементы возвращаются каждой группе, чтобы получить результат
out = [[3,4,2], [6,9], [10]]
Сложность в том, что я не могу использовать такие операции, как конкатенация, поскольку мой ввод не является стандартным списком Python и не поддерживает операции конкатенации.
Что я хочу сделать, это выбрать из списка объектов с индексами из «сцепленного» представления, но я фактически выбираю из каждого из элементов списка lb
.
Как я могу сделать это эффективным способом на Python?
===========
Редактировать:
Я реализовал медленную версию, например:
import numpy as np
bl = [[0,1,2,3,4,5], [6,7,8,9], [10,11,12,13]]
idx = [10, 6, 3, 4, 9, 2]
milestones = np.cumsum(np.array([len(el) for el in bl])).tolist()
milestones = [0,] + milestones
res = [[] for _ in bl]
for ix in idx:
for i, m in enumerate(milestones):
if ix < m:
res[i-1].append(ix)
break
Это работает для меня, но это слишком медленно. У меня есть способ сделать это быстрее?