Нарезка вложенного списка на основе другого вложенного списка

Я пытаюсь разрезать подсписки (arr), используя элементы из других подсписков (slc). Я использую Питон. Мой код работает нормально, если в подсписках для разрезания нет повторяющихся значений (arr). В противном случае я не смогу получить правильные куски.

arr[0] необходимо нарезать с помощью slc[0], arr[1] необходимо нарезать с помощью slc[1] и arr[2] необходимо нарезать с помощью slc[2].

Вот пример и код, который я использую прямо сейчас:

arr=[[5, 9, 8, 1, 0, 10, 11, 5], [13, 4, 13, 2, 5, 6, 13], [8, 25, 13, 9, 8, 7]]

slc=[[0, 5], [5, 13], [13, 7]]

rslt=[]

for i in range(len(arr)):
    rslt.append(arr[i][arr[i].index(slc[i][0]):arr[i].index(slc[i][1])+1])

текущий результат:

rlst=[[], [], [13, 9, 8, 7]]

ожидаемый результат:

rlst=[[0, 10, 11, 5], [5, 6, 13], [13, 9, 8, 7]] #expected results

Мой текущий код не работает для arr[0] и arr[1], поскольку в slc[0] и slc[1] есть несколько элементов из arr[0] и arr[1] соответственно, поэтому процедура нарезки не работает должным образом.

Что, если 5 после 0 встречается несколько раз? Вы хотите пойти к последнему или к первому?

Barmar 19.08.2024 22:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

list.index() позволяет указать начальный индекс, с которого нужно начать поиск. Поэтому используйте индекс первого элемента в качестве аргумента при поиске конечного индекса.

for a, (start, end) in zip(arr, slc):
    slice_start = a.index(start)
    slice_end = a.index(end, slice_start + 1)
    rslt.append(a[slice_start:slice_end + 1])

Какая версия Python имеет list.rindex?

no comment 23.08.2024 12:26

Я сделал неверную догадку, что он будет, потому что str.rindex существует.

Barmar 23.08.2024 17:17
arr=[ [5, 9, 8, 1, 0, 10, 11, 5], [13, 4, 13, 2, 5, 6, 13], [8, 25, 13, 9, 8, 7]]

slc=[[0, 5] , [5, 13], [13, 7]]

rslt=[]

for i, x in enumerate(arr):

    # start index
    st_idx = x.index(slc[i][0])

    # create a sub list from start index to rest of the list
    sub = x[st_idx:]    
    
    # end index is taken from the sublist
    end = sub.index(slc[i][1])

    # end index is taken as end + 1 as you need end value to be in the list
    rslt.append(sub[:end+1])

print(rslt)

# Output : [[0, 10, 11, 5], [5, 6, 13], [13, 9, 8, 7]]

Другие вопросы по теме