1

宿題として、Python の標準的な並べ替え機能を使用せずに、与えられた 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]

これでうまくいくように見えますが、リストの最初の 2 つのエントリに対してのみです。ループには 3 番目のエントリは含まれません。

スクリプトに 3 つのエントリすべてを含めるにはどうすればよいですか?

前もって感謝します!サンダー

4

4 に答える 4

6

sum([a, b, c]) - min(a, b, c) - max(a, b, c)- ソートなし!

于 2012-09-07T22:00:48.840 に答える
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]
于 2012-11-12T00:40:44.683 に答える
0

リストをループしながらその場で変更しているため、表示される要素に影響があります。

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

3が印刷されないことに注意してください。リストの 2 番目のエントリを削除することで、要素が 1 つ短くなり、ループによってリストが早期に使い果たされていることがわかります。

アイテムをループする必要はないことに注意してください。少し考えれば、いくつかの簡単な比較を行うだけで、どのアイテムが中央値であるかがわかります。:-)

于 2012-09-07T21:45:41.963 に答える
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:ですか?

于 2012-09-07T21:48:21.307 に答える