Как я могу индексировать списки Python списки без объединения? - PullRequest
0 голосов
/ 18 апреля 2019

Предположим, у меня есть такой ввод:

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

Это работает для меня, но это слишком медленно. У меня есть способ сделать это быстрее?

1 Ответ

0 голосов
/ 18 апреля 2019

Я не уверен, правильно ли я понял вашу проблему, но надеюсь, что это послужит достаточным ответом.

x=0   //to count the total number of numbers with concatination
out = []   //to store final result
for i in bl:
    temp = []
    for j in i:
        if x in idx:     //to check if you want xth indexed element
            temp.append(j)
        x+=1
    if len(temp)>0:      //only append if has an index in idx, i am not sure if you want this
        out.append(temp)
print(out)    //to print final output
...