如何通过每次都可以更改的索引删除列表中的多个元素?
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]
我有如下列表:
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]