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

されています削除メソッドが適用されています。ダミーの使い方については、mem3を直接削除してエラーが出たときに使いました。これは私のデバッグプロセスの一部でした。

更新:最後にエラーの原因を特定しました。コードの抜け穴を追跡したメンバーの一人(Bharel)に感謝します。アイテムがneighborlistに複数回追加されていたため、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(outerlist)lenの場合> 1: outerlistでMEM1ため\t: \t \t MEM2ためbody2listで: \t \tオーバーラップ(MEM1、MEM2、maxrad、LX、LY、LZ)== 1の場合: もしmem2 in neighborlist: pass else: \t \t neighborlist.append(mem2) – user6872802

+0

こんにちは@ user6872802あなたの質問を解決した場合は、チェックマークをクリックして受け入れることを検討してください。これは、あなたが解決策を見つけ出し、回答者とあなた自身の両方に評判を与えていることを広範なコミュニティに示します。これを行う義務はありません。 – Bharel

関連する問題