2016-09-23 158 views
-1
def cluster(body1list,outerlist,body2list,lx,ly,lz,maxrad): 
    neighborlist=[] 
    if any([len(body2list)==0,len(outerlist)==0]): 
        return body1list,body2list 
    else: 
     if len(outerlist)>1: 
      for mem1 in outerlist: 
       for mem2 in body2list: 
        if overlap(mem1,mem2,maxrad,lx,ly,lz)==1: 
           neighborlist.append(mem2) 
     if len(outerlist)==1: 
      for mem2 in body2list: 
       if overlap(outerlist[0],mem2,maxrad,lx,ly,lz)==1: 
           neighborlist.append(mem2) 
     body1list=neighborlist+body1list 
     if len(neighborlist)!=0: 
      for mem3 in neighborlist: 
       dummy=copy.deepcopy(mem3) 
       if dummy in body2list: 
        print "True" 
       else: 
        print "false" 
       body2list.remove(dummy) 
     return cluster(body1list,neighborlist,body2list,lx,ly,lz,maxrad)   

的錯誤消息是我得到一個錯誤

File "aggregation.py", line 107, in cluster 
    body2list.remove(dummy) 
ValueError: list.remove(x): x not in list 

正如你所看到的,要刪除的項目已從名單上拿起其中正在應用刪除方法。關於dummy的用法,我在直接刪除mem3時使用了這個錯誤。這是我的調試過程的一部分。

更新:最後確定了錯誤的來源。感謝其中一位追蹤代碼漏洞的成員(Bharel)。項目被多次添加到鄰居列表中,因此當我嘗試從body2list中刪除它們時導致錯誤。正確的代碼如下所示:

if len(outerlist)>1: 
     for mem1 in outerlist: 
     for mem2 in body2list: 
      if overlap(mem1,mem2,maxrad,lx,ly,lz)==1: 
          if mem2 in neighborlist: 
            pass 
          else: 
            neighborlist.append(mem2) 

在小型稀釋系統上進行測試時,此工作方式的結果與成像結果一致。謝謝你的耐心。

+0

的錯誤似乎很清楚 - 如果'dummy' _isn't_在'neighborlist'然後有機會,它可能不也可以在'body2list'中...那究竟是什麼問題? – mgilson

回答

0

我最好的猜測是,該項目被添加到neighborlist幾次,從而從body2list更多次刪除它比存在引發異常。

此外,請記住您正在使用深層複製,這意味着您創建了一個新實例。如果複製的對象不覆蓋__eq__那麼它是不一樣的:

a = object() 
l = [a] 
l.remove(copy.deepcopy(a)) # Raises exception 
+0

你的猜測是正確的。項目被多次添加到鄰居列表中,因此在嘗試刪除它們時導致錯誤。更正的代碼如下。 \t如果len(outerlist)> 1: \t用於outerlist MEM1: \t \t用於body2list MEM2: \t \t如果重疊(MEM1,MEM2,maxrad,LX,LY,LZ)== 1: 如果MEM2在neighborlist: 通 其他: \t \t neighborlist.append(MEM2) – user6872802

+0

嗨@ user6872802,如果這個或任何答案已經解決您的問題,請考慮點擊複選標記接受它。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 – Bharel

相關問題