2014-02-27 2 views
0

나는이 프로그램을 사용하여 한 그룹의 점에 대한 3d 거리를 계산했다.union 파이썬에서리스트의리스트

[4.217700795331081, 5.922339064664832, 3.554222840244929, 2.1374049685457694, 7.046453008421205, 8.107835716151763] 

PS :

test = dist_3d(points) 
print test 
[[4.217700795331081, 5.922339064664832, 3.554222840244929], [2.1374049685457694, 7.046453008421205], [8.107835716151763]] 

내가 얻고 자하는 결과는 다음과 같다 :

points = [(472765.09, 6191522.78, 13.0), (472764.82, 6191524.09, 9.0), (472763.8, 6191525.68, 8.0), (472764.07, 6191524.39, 16.0)] 


def dist3d((x0, y0, z0), (x1, y1, z1)): 
    return math.sqrt((x0-x1)**2+(y0-y1)**2+(z0-z1)**2) 

def dist_3d(obs): 
    dist_list = list() 
    while len(obs) != 1: 
     obs_g = [(obs[0], x) for x in obs[1:]] 
     dist_list.append([dist3d(obs_g[i][0], obs_g[i][1]) for i in xrange(len(obs_g))]) 
     obs.pop(0) 
    return dist_list 

결과는 거리 목록의 목록입니다 코드가 있기 때문에 최적화되지 않습니다 " points "함수가 하나의 요소로만 반환 된 후의 목록

points = [(472765.09, 6191522.78, 13.0), (472764.82, 6191524.09, 9.0), (472763.8, 6191525.68, 8.0), (472764.07, 6191524.39, 16.0)] 
test = dist_3d(points) 
points 
[(472764.07, 6191524.39, 16.0)] 
012 3,516,

답변

1

첫 번째 문제를 해결하려면,이 라인에 list.extend을 사용

dist_list.append([dist3d(obs_g[i][0], obs_g[i][1]) for i in xrange(len(obs_g))]) 

같이 :

  ###### 
dist_list.extend([dist3d(obs_g[i][0], obs_g[i][1]) for i in xrange(len(obs_g))]) 
      ###### 

Here가 도움이 이유의 데모입니다.


두 번째 문제는이 라인에서 온다 :

obs.pop(0) 

obspoints 때문에 모두 동일한 목록 개체를 참조, obs.pop 직접 points.pop를 호출 한 것과 같은 상태가된다 호출. 즉, 행이 실행될 때마다 항목이 points에서 나타납니다. 결국 points에 항목이 하나만 포함됩니다.

copy = obs[:] 

그런 다음, 복사에 pop 전화 :

dist_3d 내부 points의 단순 복사본을 만들어이 문제를 해결하려면. 이렇게하면 points은 영향을받지 않습니다. 다음은


는 수정 된 코드를 보는 방법입니다 :

import math 

points = [(472765.09, 6191522.78, 13.0), (472764.82, 6191524.09, 9.0), (472763.8, 6191525.68, 8.0), (472764.07, 6191524.39, 16.0)] 

def dist3d((x0, y0, z0), (x1, y1, z1)): 
    return math.sqrt((x0-x1)**2+(y0-y1)**2+(z0-z1)**2) 

def dist_3d(obs): 
    dist_list = list() 
    copy = obs[:] 
    while len(copy) != 1: 
     obs_g = [(copy[0], x) for x in copy[1:]] 
     dist_list.extend([dist3d(obs_g[i][0], obs_g[i][1]) for i in xrange(len(obs_g))]) 
     copy.pop(0) 
    return dist_list 

을 그리고 여기 샘플 실행 :

>>> import math 
>>> points = [(472765.09, 6191522.78, 13.0), (472764.82, 6191524.09, 9.0), (472763.8, 6191525.68, 8.0), (472764.07, 6191524.39, 16.0)] 
>>> def dist3d((x0, y0, z0), (x1, y1, z1)): 
...  return math.sqrt((x0-x1)**2+(y0-y1)**2+(z0-z1)**2) 
... 
>>> def dist_3d(obs): 
...  dist_list = list() 
...  copy = obs[:] 
...  while len(copy) != 1: 
...   obs_g = [(copy[0], x) for x in copy[1:]] 
...   dist_list.extend([dist3d(obs_g[i][0], obs_g[i][1]) for i in xrange(len(obs_g))]) 
...   copy.pop(0) 
...  return dist_list 
... 
>>> test = dist_3d(points) 
>>> print test 
[4.217700795331081, 5.922339064664832, 3.554222840244929, 2.1374049685457694, 7.046453008421205, 8.107835716151763] 
>>> print points 
[(472765.09, 6191522.78, 13.0), (472764.82, 6191524.09, 9.0), (472763.8, 6191525.68, 8.0), (472764.07, 6191524.39, 16.0)] 
>>> 
+0

감사 ICodez. 테스트에서 한 요소의 문제가 지속됩니다. 게시물의 업데이트보기 –

0
import itertools 

def dist_3d(obs): 
    dist_list = list() 
    while len(obs) != 1: 
     obs_g = [(obs[0], x) for x in obs[1:]] 
     dist_list.append([dist3d(obs_g[i][0], obs_g[i][1]) for i in xrange(len(obs_g))]) 
     obs.pop(0) 
    return list(itertools.chain(*dist_list))