Python,我在循环中重复了很多,必须有更好的方法

Ari*_*ian 11 python for-loop dry

假设我有三个列表,我需要遍历它们并对内容做一些事情.

这三个名单streaks_0,streaks_1streaks_2.对于每个列表,我需要使用特定于每个列表的不同值.例如,streak_0_num0sstreaks_1for循环中不起作用.

有没有办法让这三个for循环成为一个或至少一种方法来清理它?

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))
Run Code Online (Sandbox Code Playgroud)

Cod*_*ker 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)
Run Code Online (Sandbox Code Playgroud)


BPL*_*BPL 11

您可以使用以下函数轻松简化代码:

def calculate_avg(lst):
    return sum(lst)/(len(lst)-lst.count(0))
Run Code Online (Sandbox Code Playgroud)

如果您愿意,还是这个:

def calculate_avg(lst):
    return sum(lst) / len([l for l in lst if l != 0])
Run Code Online (Sandbox Code Playgroud)

这是一个小用法示例:

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)))
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 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)
Run Code Online (Sandbox Code Playgroud)


MSe*_*ert 5

正如其他人已经说过的那样:当你发现自己多次重复时:尝试创建一个可以重复使用的功能.

然而,看看周围是否有人已经实现了这样的功能总是一个好主意.在您的情况下,您可以使用numpy.mean(numpy是第三方模块)或statistics.mean(statistics是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
Run Code Online (Sandbox Code Playgroud)

要么:

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
Run Code Online (Sandbox Code Playgroud)