2013-10-08 3 views
0

몇 가지 작업을하고 이상한 문제가 발생하여 문제를 발견하게되었습니다. 저는 10,000 개의 값을 가진 목록을 두 가지 방법으로 정렬합니다. 하나는 빠른 선택을 사용하는 것이고 다른 하나는 삽입 종류의 유이를 사용하는 것입니다. 이것의 목표는 중간 값을 찾고 중간 값을 사용하여 중간 값과 모든 값 사이의 총 거리를 찾아야합니다. 중앙값 계산은 완벽하게 정상적으로 작동하지만 전체 계산은 다른 값을 반환한다는 것을 이해할 수없는 이유로들 수 있습니다. 합계를 계산하는 함수의 입력은 목록과 중앙값입니다. 두 프로그램 사이의 중앙값은 동일하게 유지되지만 목록의 값도 정렬되지만 목록 중 하나는 정렬되고 다른 목록은 정렬되지 않습니다. 여기 파이썬 : 정렬되지 않은/정렬 된 목록 다른 값을 반환 하시겠습니까?

내가 총을 계산하는 데 사용하고 무엇을 나는 것 한 목록이 정렬되는 또 다른 이유는 분류되지 않는으로

def ttlDist(lst, med): 
    total = 0 
    for i in lst: 
     total = abs(med - i) 
    print(total) 

... (이에 서식하는 여기 이상으로 잘 그것은 단지 사본이다) 대폭적으로 다른 가치를 얻고 있는가? refrence를 위해 삽입 정렬을 사용할 때 거리는 49846.0이지만 quickselect를 사용할 때 얻을 수있는 거리는 29982입니다.

+0

(의대를 - 1) '. 지금,'total'은 단지 abs (med - lst [-1])입니다. – Blender

답변

1

누적되지 않습니다. 루프를 통해 매번 total을 새로운 값으로 대체하려고합니다. 따라서 루프가 끝날 때 total은 마지막 요소 인 lst의 값입니다. 정렬 된 목록과 정렬되지 않은 목록에는 일반적으로 서로 다른 마지막 요소가 있습니다. 아마 당신은 원하는 무엇

은 다음과 같습니다

total += abs(med - i) 

또는, 더 간단하게 가지고있는 전체의 기능을 대체 : 나는 당신이`총 + = 복근 일을해야한다고 생각

total = sum(abs(med-i) for i in lst) 
+0

어리석은 실수 롤, 고마워요 :) – BLU

+0

@ 브루 : 그건 항상 자신의 코드에서 볼 수있는 가장 힘든 실수입니다. 당신이 정말로 뭔가 영리한 일을했지만 게시 된 알고리즘에 버그가 있었지만, 그 알고리즘을 발견하고 천재처럼 보일 수 있습니다. 프로그램에서 가장 단순한 줄에서 어리석은 오타를 만든 곳 ... 누군가가 와서 "이봐, 바보, 너 잊어 버렸어."라고 말할 때까지 하루 종일 벽에 머리를 때릴거야. " (적어도 저에게는 항상 일어나는 일이 있습니다.) – abarnert