Python:删除满足特定条件的所有列表索引

5 投票
8 回答
3922 浏览
提问于 2025-04-17 00:12

说到重点,我想在Python中遍历一组坐标对,并删除所有包含负数坐标的情况。例如:

在这个数组中:

map = [[-1, 2], [5, -3], [2, 3], [1, -1], [7, 1]]

我想去掉所有任意一个坐标小于0的对,留下:

map = [[2, 3], [7, 1]]

我的问题是,Python的列表不能有空缺,所以如果我这样循环:

i = 0
for pair in map:
        for coord in pair:
            if coord < 0:
                del map[i]
    i += 1

当删除一个元素后,所有的索引都会移动,这样就会搞乱遍历,导致各种问题。我试过把不好的元素的索引存到另一个列表里,然后再循环删除那些元素,但我还是遇到同样的问题:一旦删除了一个,整个列表就会移动,索引就不再准确了。

我是不是漏掉了什么?

谢谢。

8 个回答

1

如果你没有其他地方在使用这个 map 列表,那么用列表推导式是最好的选择:

map = [[a,b] for (a,b) in map if a > 0 and b > 0]

但如果你有其他地方在用这个列表,并且需要真正从 map 列表中删除元素,那么你就得对 map 的一个副本进行遍历:

for coord in map[:]:
    if coord[0] < 0 or coord[1] < 0:
        map.remove(coord)
3

你可以使用列表推导式来实现这个功能:

>>> mymap = [[-1, 2], [5, -3], [2, 3], [1, -1], [7, 1]]
>>> mymap = [m for m in mymap if m[0] > 0 and m[1] > 0]
>>> mymap
[[2, 3], [7, 1]]
3

如果列表不大,最简单的方法就是创建一个新的列表:

In [7]: old_map = [[-1, 2], [5, -3], [2, 3], [1, -1], [7, 1]]

In [8]: new_map=[[x,y] for x,y in a_map if not (x<0 or y<0)]

In [9]: new_map
Out[9]: [[2, 3], [7, 1]]

如果你想丢掉原来的元素,可以接着用 old_map = new_map 这行代码。

但如果列表非常大,创建一个同样大小的新列表就会有问题,这时候你可以在原列表上直接删除元素——诀窍是先从列表的尾部开始删除:

the_map = [[-1, 2], [5, -3], [2, 3], [1, -1], [7, 1]]
for i in range(len(the_map)-1,-1,-1):
    pair=the_map[i]
    for coord in pair:
        if coord < 0:
            del the_map[i]

print(the_map)

这样做会得到:

[[2, 3], [7, 1]]

另外,map 是一个非常有用的Python内置函数。最好不要把变量命名为 map,因为这样会覆盖掉这个内置函数。

撰写回答