Python:删除满足特定条件的所有列表索引
说到重点,我想在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
,因为这样会覆盖掉这个内置函数。