2012-10-18 57 views
0

我有一個相當可怕的算法來比較原子之間的距離,但它的作品不是我希望它的工作。下面是代碼:Python:4個循環,比較列表項

for k in ResListA: 
    for n in ResListB: 
    for m in ResListA[counter3].atoms: 
     for z in ResListB[counter4].atoms: 
      coordDist = distance.distance(ResListA[counter3].atoms[counter4],ResListB[counter2].atoms[counter1]) 
      counter1 = counter1 + 1 
     counter1 = 0   
     counter4 = counter4 + 1 
    counter4 = 0 
    counter2 = counter2 + 1 
    counter2 = 0 
    counter3 = counter3 + 1 

基本上我想要的最小距離之間

ResListA [0] .atoms [0,..,N]

ResListB [0,.., k] .atoms [0,..,m]

被計算。然而,它計算

ResListA [0] .atoms [0]

ResListB [0,..,K] .atoms [0,..,米]

例如:

ResListA [N,P,C,N,C] ResListB [C,C] [P,P] ...

它應該是

DIST(N,C)DIST(N, C)DIST(P,C)DIST(P,C)

DIST(N,C)DIST(N,C)DIST(N,P)DIST(N,P )

預先感謝您。

+0

這是非常可怕的,並且縮進看起來不太正確。 – piokuc

+0

在分配任何內容之前,您似乎正在使用'counter1'。 –

+0

如果你可以忍受Numpy/Scipy的依賴,這看起來像['scipy.spatial.cdist']的工作(http://docs.scipy.org/doc/scipy/reference/generated/scipy .spatial.distance.cdist。HTML),因爲你正在做成對的距離。 –

回答

2

我認爲你的代碼可以寫得更像這樣。

for k in ResListA: 
    for n in ResListB: 
     for m in k.atoms: 
      for z in n.atoms: 
       coordDist = distance.distance(m.atoms, z.atoms) 

不知道distance.distance做什麼。你不應該在做coordDist涉及min()嗎?

+0

我想你的意思是'distance.distance(m,z)'。 –

+0

距離是一個模塊,我用它來進行簡單的3D距離計算。總的來說,我試圖獲得一個矩陣與氨基酸之間的最小距離,其中包含原子,我想要計算距離。 –

+0

@gnibbler,測試了你的代碼,它給出了相同的結果,它仍然通過'ResListA'中的第一個原子遍歷所有'ResListB' –

0

雖然gnibbler是在可能正確的是你應該做的,這是當前的代碼可以簡化爲:

for k in ResListA: 
    for n in ResListB: 
     for counter4, m in enumerate(k.atoms): 
      for counter1, z in enumerate(ResListB[counter4].atoms): 
       coordDist = distance.distance(m, n.atoms[counter1]) 

您的問題是,你需要:

for z in ResListB[counter2].atoms: 

,而不是

for z in ResListB[counter4].atoms: