2017-03-27 1 views
0

저는 프로그래밍에 다소 익숙하며 파이썬에서 두 목록의 목록을 비교하려고합니다. 그러나이 목록의 수레는 오류가있을 수 있습니다. 여기에 예제 :Python - 근사 수와 함께 목록 목록 비교

first_list = [['ATOM', 'N', 'SER', -1.081, -16.465, 17.224], 
       ['ATOM', 'C', 'SER', 2.805, -3.504, 6.222], 
       ['ATOM', 'O', 'SER', -17.749, 16.241, -1.333]] 

secnd_list = [['ATOM', 'N', 'SER', -1.082, -16.465, 17.227], 
       ['ATOM', 'C', 'SER', 2.142, -3.914, 6.222], 
       ['ATOM', 'O', 'SER', -17.541, -16.241, -1.334]] 

예상 출력 :

Differences = ['ATOM', 'C', 'SER', 2.805, -3.504, 6.222] 

지금까지 내 tryings : 나는 구축하는 방법을 잘 모릅니다이

def aprox (x, y): 
    if x == float and y == float: 
     delta = 0.2 >= abs(x - y) 
     return delta 
    else: rest = x, y 
    return rest 

def compare (data1, data2): 
    diff = [x for x,y in first_list if x not in secnd_list and aprox(x,y)] + [x for x,y in secnd_list if x not in first_list and aprox(x,y)] 
    return diff 

또는 튜플의 도움으로하지만, 근사값 :

def compare (data1, data2): 
    first_set = set(map(tuple, data1)) 
    secnd_set = set(map(tuple, data2)) 
    diff = first_set.symmetric_difference(secnd_set) 
    return diff 

당신이 나를 도울 수 있기를 바랍니다! :)

+0

귀하의 초기'compare' 기능은 매개 변수'data1'와'data2'을 가지고 있지만, 당신은 (세계?) 참조. – blacksite

+0

시도해보십시오. http://stackoverflow.com/questions/6105777/how-to-compare-a-list-of-lists-sets-in-python – manvi77

+0

fyi 'isinstance (x, float)'는 번호를 확인하는 방법입니다 유형 – ryugie

답변

4

if x == float and y == float 

부정확 라인 ... 변수의 타입을 확인 적절한 방법 는

와 상기 광고를 교체한다 ... type() 함수를 사용하는
if type(x) is float and type(y) is float: 
0

이것은 다소 혼란 스럽지만 나는 비행 중에 해냈고 원하는 결과를 얻었습니다. 코드에서 언급했듯이 임계 값을 0.2으로 설정하면 두 행이 반환되어야 함을 의미합니다.

def discrepancies(x, y): 
    for _, (row1, row2) in enumerate(zip(x, y)): 
     for _, (item1, item2) in enumerate(zip(row1[3:],row2[3:])): 
      if abs(item1 - item2) >= 0.2: 
       print row1 
       break 

discrepancies(first_list, secnd_list) 
['ATOM', 'C', 'SER', 2.805, -3.504, 6.222] 
['ATOM', 'O', 'SER', -17.749, 16.241, -1.333] 

몇 가지주의 사항이 루프에 대한 각으로 상당히 느린 얻을 것이다 귀하의 목록 내에서 큰 목록은 내가 그것이라고 믿는 itertools.izip 기능을 사용하기위한 O (N) 등을 추가합니다. 희망이 도움이!

0

두 요소의 각 요소를 반복하고 하위 요소를 비교할 수 있습니다. 그러면 하위 요소가 같지 않은 경우 유형에 따라 결과에 추가 할 수 있습니다. 즉 두 개의 문자열이있는 경우 동일하지 않은, 그것은 결과에 첨가 될 수 있거나 플로트하고 있으면 math.isclose()을 근사에 사용할 수

참고 : 수정 제 3 요소에 음의 부호가 누락되어, 기대 출력과 일치하도록 만들어진 first_list

import math 

first_list = [['ATOM', 'N', 'SER', -1.081, -16.465, 17.224], 
       ['ATOM', 'C', 'SER', 2.805, -3.504, 6.222], 
       ['ATOM', 'O', 'SER', -17.749, -16.241, -1.333]] # changes made 

secnd_list = [['ATOM', 'N', 'SER', -1.082, -16.465, 17.227], 
       ['ATOM', 'C', 'SER', 2.142, -3.914, 6.222], 
       ['ATOM', 'O', 'SER', -17.541, -16.241, -1.334]] 

diff = [] 
for e1, e2 in zip(first_list, secnd_list): 
    for e_sub1, e_sub2 in zip(e1, e2): 
     # if sub-elements are not equal 
     if e_sub1 != e_sub2: 
      # if it is string and not equal 
      if isinstance(e_sub1, str): 
       diff.append(e1) 
       break # one element not equal so no need to iterate other sub-elements 
      else: # is float and not equal 
       # Comparison made to 0.2 
       if not math.isclose(e_sub1, e_sub2, rel_tol=2e-1): 
        diff.append(e1) 
        break # one element not equal so no need to iterate other sub-elements 
diff 
,451,515,

출력 :`객체 first_list`와`secnd_list` 및 매개 변수를 사용하지 않을

[['ATOM', 'C', 'SER', 2.805, -3.504, 6.222]]