我在以下代码

时间:2016-09-23 23:07:09

标签: python python-2.7

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 

如您所见,要删除的项目是从应用remove方法的列表中选取的。关于虚拟的用法,我在直接删除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)

在小型稀释系统上进行测试时,这样可以获得与成像结果一致的结果。谢谢你的耐心等待。

1 个答案:

答案 0 :(得分:0)

我最好的猜测是,该项目会被添加几次到neighborlist,因此从body2list移除它比存在的次数多一次会引发异常。

另外,请记住,您正在使用深层复制,这意味着您要创建一个新实例。如果您正在复制一个不覆盖__eq__的对象,那么它就不一样了:

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