2015-11-06 118 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

已更新的答案。感謝信息,我完全忘記了雙重比較,這是一個很好的方法,我沒有意識到。 –