根据索引列表从列表中删除项目
Remove items from list according to a list of indexes
我有一个这样的项目列表:
A = [[0 A B],[1 C D],[2 E F],[3 G H],[4 I L],[5 M N],[6 O P],[7 Q R],[8 S T],[9 U Z]]
然后我像这样定义另一个列表:
index = [0,2,6]
我的目标是从 A 中删除列表 1、3 和 7,结果是:
A = [[1 C D],[3 G H],[4 I L],[5 M N],[7 Q R],[8 S T],[9 U Z]]
删除此类项目的最明智方法是什么?如果可能的话,我想在不使用 for 循环的情况下实现它。
我尝试使用以下代码,但显然它不起作用,因为每次迭代都会影响 A 的大小
for j in index:
del A[j]
我的简单技巧是从头到尾删除它们,所以删除的位置不受影响
for j in sorted(index, reverse=True):
del A[j]
可能最实用(和 Pythonic)的方法是创建一个 new 列表,省略原始列表中那些索引处的元素:
def remove_by_indices(iter, idxs):
return [e for i, e in enumerate(iter) if i not in idxs]
查看实际效果 here。
使用列表理解和enumerate
创建新列表:
A = [['0 A B'],['1 C D'],['2 E F'],['3 G H'],['4 I L'],['5 M N'],['6 O P'],['7 Q R'],['8 S T'],['9 U Z']]
print([element for index, element in enumerate(A) if index not in (0, 2, 6)])
>> [['1 C D'], ['3 G H'], ['4 I L'], ['5 M N'], ['7 Q R'], ['8 S T'], ['9 U Z']]
或者,使用列表推导式创建一个具有所需属性的新列表,然后立即替换旧列表。
A = [i for i in A if i[0] not in [0, 2, 6]]
我有一个这样的项目列表:
A = [[0 A B],[1 C D],[2 E F],[3 G H],[4 I L],[5 M N],[6 O P],[7 Q R],[8 S T],[9 U Z]]
然后我像这样定义另一个列表:
index = [0,2,6]
我的目标是从 A 中删除列表 1、3 和 7,结果是:
A = [[1 C D],[3 G H],[4 I L],[5 M N],[7 Q R],[8 S T],[9 U Z]]
删除此类项目的最明智方法是什么?如果可能的话,我想在不使用 for 循环的情况下实现它。
我尝试使用以下代码,但显然它不起作用,因为每次迭代都会影响 A 的大小
for j in index:
del A[j]
我的简单技巧是从头到尾删除它们,所以删除的位置不受影响
for j in sorted(index, reverse=True):
del A[j]
可能最实用(和 Pythonic)的方法是创建一个 new 列表,省略原始列表中那些索引处的元素:
def remove_by_indices(iter, idxs):
return [e for i, e in enumerate(iter) if i not in idxs]
查看实际效果 here。
使用列表理解和enumerate
创建新列表:
A = [['0 A B'],['1 C D'],['2 E F'],['3 G H'],['4 I L'],['5 M N'],['6 O P'],['7 Q R'],['8 S T'],['9 U Z']]
print([element for index, element in enumerate(A) if index not in (0, 2, 6)])
>> [['1 C D'], ['3 G H'], ['4 I L'], ['5 M N'], ['7 Q R'], ['8 S T'], ['9 U Z']]
或者,使用列表推导式创建一个具有所需属性的新列表,然后立即替换旧列表。
A = [i for i in A if i[0] not in [0, 2, 6]]