为了解决这个问题,我尝试迭代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当元素被删除时,所有的索引都会移动,这会扰乱迭代,并导致各种问题。我曾尝试将错误元素的索引存储在另一个列表中,然后循环并删除这些元素,但我遇到了相同的问题:一旦一个元素消失,整个列表就会移位,索引也不再准确。
我是不是漏掉了什么?
谢谢。
发布于 2011-08-23 23:23:18
如果列表不大,那么最简单的方法是创建一个新列表:
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]]PS。map就是一个非常有用的内置Python函数。最好不要将变量命名为map,因为这会覆盖内置变量。
发布于 2011-08-23 23:21:06
您可以使用list comprehension来执行以下操作:
>>> 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]]发布于 2011-08-23 23:27:56
如果您没有对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)https://stackoverflow.com/questions/7163406
复制相似问题