Class 用于比较元素的嵌套循环

Class 用于比较元素的嵌套循环,class,python-3.x,methods,Class,Python 3.x,Methods,我必须写一个函数,返回有多少个圆是“单独”的,这意味着不接触任何其他圆。所有圆圈都包含在一个名为self.\u的列表中 我已经有了一个名为overlaps(aCircle)的函数,如果它确实与另一个圆重叠,则返回True;如果它没有重叠,则返回None。所以基本上,我必须检查列表中的一个圆是否与同一列表中的另一个圆重叠,如果它不返回任何值,则表示它是“单独的” 我似乎无法理解我如何在不比较圆是否重叠的情况下在同一列表上迭代两次,因为这将始终返回True使用Python的itertools,您可以

我必须写一个函数,返回有多少个圆是“单独”的,这意味着不接触任何其他圆。所有圆圈都包含在一个名为
self.\u
的列表中

我已经有了一个名为
overlaps(aCircle)
的函数,如果它确实与另一个圆重叠,则返回True;如果它没有重叠,则返回None。所以基本上,我必须检查列表中的一个圆是否与同一列表中的另一个圆重叠,如果它不返回任何值,则表示它是“单独的”


我似乎无法理解我如何在不比较圆是否重叠的情况下在同一列表上迭代两次,因为这将始终返回
True

使用Python的itertools,您可以迭代列表中所有可能的圆对。这还有一个额外的好处,即如果您已经将A与B进行了比较,那么最终不会将B与A进行重新比较

from itertools import combinations
for circle1, circle2 in combinations(self.__, 2):
    if circle1.overlaps(circle2):
        # do something

如果列表中的圆值是不同的,那么这就足够了

for c1 in range(len(self.__)):
    for c2 in range(len(self.__)):
        if c2 < c1: #If prevents comparison twice thanks to Terry Jan Reedy's suggestion
            circle1 = self._[c1]
            circle2 = self._[c2]
            #check if circle overlaps using circle1 and circle2

您可以使用一对索引(例如
current
compare
)并执行例如
if current!=比较和重叠(圆[当前]、圆[比较])
,或者允许直接比较实例是否相等,或者……这会对每个实例进行两次比较。为了避免这种情况,对于范围(c1):中的c2,将内部循环限制为小于c1:
的索引c2,然后是
circle2=self.\uuuu[c2]
。这是迭代矩阵非对角下三角的标准技术。更新答案。谢谢你提供的信息,我完全忘记了双重比较,这是一个我不知道的好方法。
for c1, circle1 in enumerate(self.__):
    for c2, circle2 in enumerate(self.__):
        if c2 < c1: #If prevents comparison twice thanks to Terry Jan Reedy's suggestion
            #check if circle overlaps using circle1 and circle2