Как удалить несколько элементов списка по индексу, который можно менять каждый раз? - PullRequest
1 голос
/ 28 мая 2019

У меня есть список, подобный приведенному ниже:

A =  [1, 2, 3, 4]

После использования перечисления у меня есть следующий список:

A = [(0, 1), (1, 2), (2, 3), (3, 4)]

После проверки условия я понял, что мне не нужноэлементы с индексами 0 и 2. Это означает, что мое условие возвращает список, подобный приведенному ниже, который может каждый раз меняться:

condA = [(0, 1), (2, 3)]

Я знаю, что могу использовать del или .pop() для удаленияэлемент из списка.Однако мне было интересно, как я могу прочитать числа вроде (0) и (2) в моем condA list и удалить эти элементы из моего исходного списка.Я не хочу вводить 0 и 2 в моем коде, потому что каждый раз они будут отличаться.

Результат будет таким:

A_reduced = [2, 4]

Спасибо.

Ответы [ 4 ]

1 голос
/ 28 мая 2019

Прокрутите condA, вытолкните элемент из списка A.Вам нужен счетчик для уменьшения индексов, так как размер A уменьшается.Обязательно отсортируйте condA:

A =  [1, 2, 3, 4]
condA = [(0, 1), (2, 3)]

i = 0
for item in condA:
    A.pop(item[0]-i)
    i+=1
#result: [2, 4]
1 голос
/ 28 мая 2019

IIUC, возможно, функция является правильным способом:

A =  [1, 2, 3, 4]

def remove_items(lis, idx):
    lis2=lis.copy()
    [lis2.pop(i) for i in idx]
    return lis2

A_reduced=remove_items(A,[0,2])

Вывод:

Out[32]: [2, 3]

Вы можете добавить любой список индексов, который вы хотите, и он удалит их изсписок.(Если они существуют)

Редактировать: скорректировать с учетом новых значений и изменить функцию, чтобы вы также сохранили свой исходный список (если это необходимо)

1 голос
/ 28 мая 2019

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

rm_lst = [x[0] for x in condA]

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

A = [(0, ((11), (12))), (1, ((452), (54))), (2, ((545), (757))), (3, ((42), (37)))]
A_reduced = [x[1] for x in A if x[0] not in rm_lst]

Окончательный код:

A = [(0, ((11), (12))), (1, ((452), (54))), (2, ((545), (757))), (3, ((42), (37)))] 
condA = [(0, ((11), (452))), (2, ((545), (757)))]
rm_lst = [x[0] for x in condA]
A_reduced = [x[1] for x in A if x[0] not in rm_lst]
print(A_reduced)
1 голос
/ 28 мая 2019

Если вы хотите удалить элементы из списка внутри цикла, вы должны выполнять итерацию от последней к первой:

for i in range(len(A) - 1, -1, -1):
    if true:  # replace with condition
        del A[i]

Upd.

Вы также можете использовать списки для этого, , но вы должны инвертировать ваше условие (A[i][0] != 11 => A[i][0] == 11):

A = [A[i] for i in range(len(A)) if inverted_condition]
...