如何通过每次都可以更改的索引删除列表中的多个元素?

How to remove several elements of a list by the index which can be changed each time?

我有如下列表:

A =  [1, 2, 3, 4]

使用枚举后我得到以下列表:

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

检查条件后,我意识到我不需要索引为 0 和 2 的元素。 这意味着我的条件 returns 如下所示的列表每次都可能不同:

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

我知道我可以使用 del.pop() 从列表中删除一个元素。 但是,我想知道如何读取 condA list 中的 (0) 和 (2) 之类的数字并从原始列表中删除这些元素。 我不想在我的代码中输入 0 和 2,因为每次它们都会不同。

结果是这样的:

A_reduced = [2, 4]

如果你想在循环中从列表中删除元素,你应该从最后到第一个迭代:

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

更新

您也可以为此使用列表理解,但是您应该反转您的条件 (A[i][0] != 11 => A[i][0] == 11):

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

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]

您可以添加任何您想要的索引列表,它会从列表中删除它们。 (如果存在)

编辑:根据您的新值进行了调整,并修改了函数,以便您还可以保留原始列表(如果需要的话)

如果您想从 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)

循环 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]