2016-09-23 142 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