2012-09-07 3 views
1

숙제로 나는 파이썬의 표준 정렬 함수를 사용하지 않고 3 개의 주어진 숫자의 중앙값을 찾는 스크립트를 작성해야합니다.정렬 함수를 사용하지 않고 중간 값 찾기

이것은 수업 첫 주이자 첫 프로그래밍 경험이므로 지금보다 더 어려워진다.

def med3(a,b,c): 
    list = [a, b, c] 
    newlist = [] 
    if list: 
     minimum = list[0] 
     for x in list: 
      if x < minimum: 
       minimum = x 
       newlist.append(minimum) 
       list.remove(minimum) 
      elif x >= minimum: 
       newlist.append(x) 
       list.remove(x) 

    return newlist[1] 

이 트릭을 할 것 같다,하지만리스트의 처음 두 항목에 대해 :

는 여기에 지금까지 무슨이다. 루프는 세 번째 항목을 포함하지 않습니다.

스크립트에 세 가지 항목을 모두 포함시킬 수 있습니까?

미리 감사드립니다. 샌더

당신이 무엇을보고 요소에 대한 결과를 초래하는, 그 위에 반복하는 동안이 자리에서 목록을 수정하는
+6

너무 많은 일을. 루프와리스트를 사용하지 않고 "중간 값"이 3 개의 숫자의 맥락에서 의미하는 것을 정의하십시오. –

+0

정말 필요하지 않은 코드가 많이 있습니다. 또한 숙제이기 때문에, 우리가 알아서하지 말고, 우리를 위해서 ... – Onlyjus

+2

Welcome to Stack Overflow! 여기에는 많은 불필요한 단계가 있습니다. 예를 들어'if list :'는 불필요합니다 : 방금 목록을 정의했습니다. 그러나 일반적으로 목록이나 루프는 필요하지 않습니다. 힌트 : 각각 "또는"을 사용하는 세 개의'if' 문을 사용하면됩니다. –

답변

0

:

>>> numbers = [1,2,3] 
>>> for i in numbers: 
...  if i == 2: numbers.remove(i) 
...  print i 
... 
1 
2 

3가 인쇄되지 않습니다 방법을 참고; 목록의 두 번째 항목을 제거하여 하나의 요소로 줄이고 루프는 목록을 조기에 찾아 냈습니다. 당신이 항목을 통해 루프하지 필요

주, 몇 가지 간단한 비교는 두 번째 그것에 대해 생각하면 중간 어떤 항목을 알려줍니다. :-)

0

이것에 대해 이동하는 간단한 방법이 될 것입니다,하지만 당신의 접근 방식과 같이

당신은 루프의 내부 list을 수정하고 있습니다. 그러지 마. : 귀하의 경우에는

, 당신은 newlist에서 요소를 제거해야한다 :

def med3(a,b,c): 
    list = [a, b, c] 
    newlist = [] 
    if list: 
     minimum = list[0] 
     for x in list: 
      if x < minimum: 
       minimum = x 
       newlist.pop() 
       newlist.append(minimum) 
      elif x >= minimum: 
       newlist.append(x) 
    return newlist[1] 

그러나 운동으로

, 당신은 몇 가지에 대해 생각 할 수 있습니다 :

  • 왜 당신이 요소를 목록에 넣고 반복합니다. 이것은 a, b, c를 단순히 if 문과 비교할 때 어떤 장점이 있습니까?

  • if list:일까요?

6

sum([a, b, c]) - min(a, b, c) - max(a, b, c) - 정렬 없음!

0

가장 빠른 방법은 그것을 할 수 있습니다 :

def medianFast(a, b, c): 
    if a > b: 
     if b > c: 
      return b 
     elif a > c: 
      return c 
     else: 
      return a 
    else: 
     if b < c: 
      return b 
     elif a > c: 
      return a 
     else: 
      return c 

당신에게 최악의 경우에 3 개 비교와 최상의 경우 2 개 비교를 보장합니다. 평균 2,5 건의 비교.

우리가이 짧은 쓸 수 ternary conditional 사용 :

def medianTernary(a, b, c): 
    return (b if b > c else (c if a > c else a)) if a > b else (b if b < c else (a if a > c else c)) 

당신이 짧은 버전 것이다 정렬 사용할 수있는 경우 :

def medianSorted(a, b, c): 
    return sorted([a, b, c])[1] 
관련 문제