for循环省略一些列表元素

时间:2014-03-20 14:26:19

标签: python

我要做的是创建一个圆,然后删除该圆中所有(整数)点之外的给定键(如圆与某些几何图形的区域交点)。几何图形表示为(x,y)元组的列表,圆也是如此(附加O变量等于它的中心)。我的代码是:

copy=circle
for bound in bounds:
    for point in circle:
        if checkPointSegmentIntersection(O,point,bound):
            copy.remove(point)
        print bound, point
print copy

我正在测试的圆的中心等于(5,8),半径等于3.圆的一个边界点是(5,11),并且有一个点的边界等于{{ 1}}。因此,点(5,10)(5,11)应从(5,10)中删除。 copy可以,但(5,10)没有。更重要的是,(5,11)对甚至没有出现在输出中,(5,10) (5,11)确实如此)!内循环继续绑定等于(5,10) (5,10)(5,10)是唯一省略的点。 (5,11)确实出现在其他外循环迭代中。这是怎么回事?什么可以导致循环省略其中一个点?

一点背景:这个代码在django服务器上执行,(5,11)列表中等大,它包含10-15个元素,我使用的是python 2.7。如果bounds位于checkPointSegmentIntersection(A,B,X)True之间的线段上,X功能将起作用并返回A。我也对任何有关手头一般问题的不同方法的想法持开放态度。

谢谢!

2 个答案:

答案 0 :(得分:6)

如果您认为创建列表副本,则只需创建对同一内存空间的另一个引用。相反,你应该使用

circ_copy=circle[:]

这基本上需要整个circle的副本,并将其存储为circ_copy中的新列表。现在你可以运行你的循环了。但是,您的意图完全正确地尝试遍历复制列表并对原始列表进行更改。

答案 1 :(得分:2)

分开事物可能更清楚,因此你有一个功能

checkPointSegmentIntersection(point, bounds)

返回TrueFalse以获取针对当前边界的点。

然后你可以做类似

的事情
[point for point in circle if checkPointsSegmentIntersection(point, bounds)]