0

平均と最大偏差 (平均とリストからの別の数値の間の最大の #) を見つける関数を作成するにはどうすればよいですか?

リストが [1,6,8] の場合、最大偏差が 4 で平均が 5 であることが出力されます。

次に、これら 2 つの値を引数として出力する別の関数を作成する必要があります。

コードの何が問題になっていますか? 最大偏差に .sort を使用する必要があることはわかっていますが、正確な方法はわかりません。

前の関数で既に mylist を出力したとします: def list_output(mylist)

def code(avg,max_dev):
    avg = sum(mylist)/len(mylist)
    max_dev = ????????
    return avg
    return max_dev

def main_output(avg,max_dev):
    print "The average is", avg, "The maximum deviation is", max_dev
main_output(code(avg, max_dev))
4

4 に答える 4

1

あなたの質問に対する他の回答は、リスト全体で 3 回ループします。平均を計算するために 1 回、リストの最大値と最小値を取得するためにそれぞれ 1 回。単一のループで同じことを実現できます。

def avg_max_dev(num_list):
    total = 0
    minimum = maximum = num_list[0]
    for n in num_list:
        total += n
        if n < minimum:
            minimum = n
        elif n > maximum:
            maximum = n
    avg = total / len(num_list)  # float(total) on Python2
    max_dev = max(avg - minimum, maximum - avg)
    return avg, max_dev

編集: @Slater Tyranus は、高速で容易に実装される関数summinおよびの代わりに手書きのループを使用してもパフォーマンスが向上しないことを正しく批判していmaxます。

Python3.3 の IPython で 2 つの関数のパフォーマンスをテストし、Slater Tyranus の関数でフロート キャストを削除しましたcalculate

In [25]: from random import randrange

In [26]: nums = [randrange(200) for _ in range(10**6)]

In [27]: %timeit avg_max_dev(nums)
10 loops, best of 3: 159 ms per loop

In [28]: %timeit calculate(nums)
10 loops, best of 3: 77.5 ms per loop

In [50]: # Edit: @Jon Clement's solution

In [51]: def jon_clements(num_list):
    avg = sum(num_list) / len(num_list)
    max_dev = max(abs(el - avg) for el in num_list)
    return avg, max_dev
   ....: 

In [52]: %timeit jon_clements(nums)
1 loops, best of 3: 250 ms per loop
于 2013-07-29T03:55:04.370 に答える
0

最大偏差は、平均値と最小値と最大値の差のうち大きい方になります。あなたはこのようなことをすることができます...

max_dev = max((avg - min(mylist), max(my_list) - avg)

グローバル変数は一般的には良い考えではないため、my_list をパラメーターとして関数に渡すことをお勧めします。

関数から 2 つの値を返すには、2 つのタプルを作成して両方を返す必要があります。このような...

def code(my_list):
    #code goes here
    my_avg = ...
    my_max_dev = ...
    return (my_avg, my_max_dev)

このようにコードを呼び出すことができます...

avg, max_dev = code(my_list)

また、リストに数値のみが含まれていることを確認するためのロジックも必要です。そうしないと、予期しない結果になる可能性があります。

于 2013-07-29T03:22:02.470 に答える