2017-05-31 1 views
11

私は3つのリストを持っており、それらを繰り返し、内容にいくつかのことをする必要があります。Pythonの場合、forループとなると多くのことを繰り返すので、より良い方法が必要です。

3つのリストは、streaks_0,streaks_1およびstreaks_2です。各リストについて、各リストに固有の異なる値を使用する必要があります。たとえば、streak_0_num0sは、ループのstreaks_1では機能しません。

これらの3つのループを1つにする方法や、少なくともこれをクリーンアップする方法はありますか?

for number in streaks_0: 
    if number == 0: 
     streak_0_num0s += 1 
    elif number != 0: 
     streak_0_sum += number 
streak_0_average = (streak_0_sum/(len(streaks_0) - streak_0_num0s)) 

for number in streaks_1: 
    if number == 0: 
     streak_1_num0s += 1 
    elif number != 0: 
     streak_1_sum += number 
streak_1_average = (streak_1_sum/(len(streaks_1) - streak_1_num0s)) 

for number in streaks_2: 
    if number == 0: 
     streak_2_num0s += 1 
    elif number != 0: 
     streak_2_sum += number 
streak_2_average = (streak_2_sum/(len(streaks_2) - streak_2_num0s)) 
+1

は:辞書のリストを使用します例えば。しかし、それはhttp://codereview.stackexchange.comに最も適しています –

+10

私はhttp://codereview.stackexchange.com/がコード改善を求めるサイトであるため、この質問をトピックとしてクローズすることに投票しています –

+2

無関係あなたの質問に: "elif number!= 0"を単純な "else"に減らしてください。 – jarmod

答えて

14

なぜ機能を使用しないのですか?

def get_average(streaks): 
    streak_0_num0s = 0 
    streak_0_sum = 0 

    for number in streaks: 
     if number == 0: 
      streak_0_num0s += 1 
     elif number != 0: 
      streak_0_sum += number 
    streak_0_average = (streak_0_sum/(len(streaks) - streak_0_num0s)) 
    print(streak_0_average) 

get_average(streaks01) 
get_average(streaks02) 
get_average(streaks03) 
+0

ちょっとしたことですが、返される代わりに結果を出力するので、書かれた関数の名前は 'get_average'ではなく' print_average'にする必要がありますか?もちろん、関数が自動的にその結果を出力するのは、とにかくコードの臭いです。 –

+1

@IlmariKaronenあるいは、get_averageは実際に値を返し、 'print'をその外側に置きます。 – jpmc26

+0

@IlmariKaronen本当に、私は基本的に彼のコードを書いたようにして、簡単な例を作りました。しかし、はい、それは本当にprint_averageと言うべきです、またはjpmc26が指摘したように、結果を返して、それと何かします – CodeLikeBeaker

11

あなたのコードは、簡単に1以下のような機能を簡素化することができます。

def calculate_avg(lst): 
    return sum(lst)/(len(lst)-lst.count(0)) 

またはこのいずれかご希望の場合:

def calculate_avg(lst): 
    return sum(lst)/len([l for l in lst if l != 0]) 

、ここでは少し使い方の例です:

streaks = [ 
    [1, 2, 3, 0, 0, 0, 0], 
    [0, 0, 0, 4, 5, 6, 0], 
    [0, 0, 6, 7, 8, 0, 0] 
] 

for index, streak in enumerate(streaks): 
    print("avg(streak{})={}".format(str(index).zfill(2), calculate_avg(streak))) 
6

あなたは複数回呼び出すことができ、イオン、:他人として

def calculate_average(values): 
    non_zeros = 0 
    sum = 0 

    for value in values: 
     if value != 0: 
      sum += value 
      non_zeros += 1 
    return sum/non_zeros 

streak_0_average = calculate_average(streaks_0) 
streak_1_average = calculate_average(streaks_1) 
streak_2_average = calculate_average(streaks_2) 
5

すでに言った:あなたが見つけたとき、あなたは自分自身に多くの時間を繰り返し:再使用可能な関数を作成してみてください。

しかし、誰かがこのような機能を既に実装しているかどうかを見てみるとよいでしょう。あなたの場合はnumpy.meannumpyは第三者モジュール)またはstatistics.meanstatisticsはpython 3.4+の組み込みモジュールです)を使用することができます。

あなた自身ことをしなければならないので、彼らは、ゼロを除くされ、デフォルトでは実行しない唯一のもの:

import numpy as np 

def average(streaks): 
    streaks = np.asarray(streaks) 
    streaks_without_zeros = streaks[streaks != 0] 
    return np.mean(streaks_without_zeros) 

streaks_0 = [1, 2, 3, 4, 0, 1, 2, 3] 
print(average(streaks_0)) # 2.2857142857142856 

か:もちろん

import statistics 

def average(streaks): 
    streaks_without_zeros = [streak for streak in streaks if streak != 0] 
    return statistics.mean(streaks_without_zeros) 

streaks_0 = [1, 2, 3, 4, 0, 1, 2, 3] 
print(average(streaks_0)) # 2.2857142857142856 
関連する問題