2015-11-06 120 views
0

我必须编写一个函数,返回有多少个圆圈是“单独的”,意思是不接触任何其他圆圈。所有圈子都包含在名为self.__的列表中。嵌套循环比较元素

我已经有一个叫做overlaps(aCircle)的函数,如果它与另一个圆形重叠,则返回True;如果没有,则返回None。所以基本上我必须检查一个列表中的圆圈是否与同一个列表中的另一个圆圈重叠,并且如果返回None而不是它意味着它是“单独的”。

我似乎无法理解我将如何遍历同一个列表两次,而不是比较一个圆是否自身重叠,因为这将始终返回True

+0

你可以用一对索引(例如'current'和'compare'),做如'如果当前!=比较并重叠(圈[当前],圈[比较]),或允许直接比较实例的相等性,或... – jonrsharpe

回答

0

使用Python的itertools,您可以遍历列表中所有可能的圆圈对。这有额外的好处,如果你已经为B相比,你最终不会与A

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

recomparing B如果在列表中的圈子值是不同的那么这应该足够了。

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 

否则使用enumerate跟踪哪些项目正在检查

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 
+0

这样做每次比较两次。为了避免这种情况,限制内循环的索引c2小于c1:'对于范围(c1)中的c2:'',后面跟着'circle2 = self .__ [c2]'。这是迭代矩阵的非对角下三角形的标准技术。 –

+0

已更新的答案。感谢信息,我完全忘记了双重比较,这是一个很好的方法,我没有意识到。 –