首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:删除所有满足一定条件的列表索引

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

Stack Overflow用户
提问于 2011-08-23 23:19:12
回答 8查看 3.5K关注 0票数 5

为了解决这个问题,我尝试迭代python中的坐标对列表,并删除其中一个坐标为负值的所有情况。例如:

在数组中:

代码语言:javascript
复制
map = [[-1, 2], [5, -3], [2, 3], [1, -1], [7, 1]]

我想删除坐标小于0的所有对,留下:

代码语言:javascript
复制
map = [[2, 3], [7, 1]]

我的问题是python列表不能有任何间隙,所以如果我像这样循环:

代码语言:javascript
复制
i = 0
for pair in map:
        for coord in pair:
            if coord < 0:
                del map[i]
    i += 1

当元素被删除时,所有的索引都会移动,这会扰乱迭代,并导致各种问题。我曾尝试将错误元素的索引存储在另一个列表中,然后循环并删除这些元素,但我遇到了相同的问题:一旦一个元素消失,整个列表就会移位,索引也不再准确。

我是不是漏掉了什么?

谢谢。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-08-23 23:23:18

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

代码语言:javascript
复制
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进行后续操作。

如果列表如此之大,创建一个大小相当的新列表是一个问题,那么您可以就地删除列表中的元素--诀窍是首先从末尾删除它们:

代码语言:javascript
复制
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)

收益率

代码语言:javascript
复制
[[2, 3], [7, 1]]

PS。map就是一个非常有用的内置Python函数。最好不要将变量命名为map,因为这会覆盖内置变量。

票数 3
EN

Stack Overflow用户

发布于 2011-08-23 23:21:06

您可以使用list comprehension来执行以下操作:

代码语言:javascript
复制
>>> 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
EN

Stack Overflow用户

发布于 2011-08-23 23:27:56

如果您没有对map列表的任何其他引用,则最好使用列表理解:

代码语言:javascript
复制
map = [[a,b] for (a,b) in map if a > 0 and b > 0]

如果您确实有其他引用,并且需要从由 map,引用的列表中实际删除元素,则必须遍历map的副本

代码语言:javascript
复制
for coord in map[:]:
    if coord[0] < 0 or coord[1] < 0:
        map.remove(coord)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7163406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档