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

时间:2019-05-27 21:32:00

标签: python list indexing pop del

我有一个如下列表:

A =  [1, 2, 3, 4]

使用枚举后,我有以下列表:

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

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

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

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

结果将是这样的:

A_reduced = [2, 4]

谢谢。

4 个答案:

答案 0 :(得分:1)

如果要从循环内的列表中删除元素,则应从最后一个迭代到第一个:

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]

答案 1 :(得分:1)

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]

您可以添加所需的任何索引列表,并将其从列表中删除。 (如果存在)

编辑:调整为新值,并修改了功能,以便您还保留原始列表(如果需要)

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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]