Pythoni c способ создания подсписок из списка индексов - PullRequest
1 голос
/ 05 августа 2020

Я хотел бы знать элегантный способ создания меньших списков из списка с индексами следующим образом:

Мой список:

 lst= [ 0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]

Мои индексы:

index_list=[2, 5 ,8]

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

Так что я ожидаю это взамен:

returned_list = [[0,1,5], [0,3,7], [1,3,9], [1, 0]]

Я попробуйте что-то вроде этого:

def sublist (lst, index):

tmplst = []
list_of_list = []


for j in range(len(index)):
    for i in range(len(lst)):
        if index[j] > lst[i]:
            tmplst.append(lst[i])

Пожалуйста, дайте мне знать, что я могу сделать.

Ответы [ 5 ]

1 голос
/ 05 августа 2020

Не уверен, что pythoni c, но numpy имеет встроенную функцию для этого

import numpy as np

lst = [0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
index_list = [el + 1 for el in [2, 5, 8]]

resp = np.split(lst, index_list, axis=0)

print(resp)

1 голос
/ 05 августа 2020

Индексы, которые вы используете в своем index_list, не очень похожи на pythoni c для начала, потому что они не соответствуют соглашениям об индексировании, используемым при разрезании python.

Итак, давайте начните с исправления этого:

index_list = [index + 1 for index in index_list]

Сделав это, мы можем использовать slice для получения необходимых фрагментов. None используется для обозначения начала или конца списка.

[lst[slice(start, end)] for start, end in zip([None] + index_list,
                                              index_list + [None])]
1 голос
/ 05 августа 2020

Поскольку вы пометили свой вопрос с помощью numpy, возможный ответ:

import numpy as np
lst = [ 0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
index_list = [2, 5 ,8]
index_list = [i+1 for i in index_list]  # in python indices are starting with 0
arrays_list = np.split(lst, index_list)
returned_list = list(map(list,arrays_list))
print(returned_list)

Вывод:

[[0, 1, 5], [0, 3, 7], [1, 3, 9], [1, 0]]
1 голос
/ 05 августа 2020

Давайте попробуем zip с пониманием списка:

[a[x+1:y+1] for x,y in zip([-1] + index_list, index_list + [len(a)])]

Вывод:

[[0, 1, 5], [0, 3, 7], [1, 3, 9], [1, 0]]
0 голосов
/ 05 августа 2020
lst= [ 0, 1, 5, 0, 3, 7, 1, 3, 9, 1, 0]
index_list=[2, 5 ,8,11]

index_lst2 = [slice(x -2, x +1) for x in index_list]
returned_list = [lst[index] for index in index_lst2]
print(returned_list)
...