2012-09-07 20 views
1

作爲一項家庭作業,我必須編寫一個腳本,可以找到3個給定數字的中位數,而不使用Python的標準排序功能。查找中位數而不使用排序功能

這是我在課堂上的第一週,也是我的第一次編程經驗,所以我覺得現在我很難得到任何進展。

這是我到目前爲止有:

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

歡迎來到堆棧溢出!你在這裏有許多不必要的步驟。例如,'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個比較平均。

使用,我們可以把它寫短爲:

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]