Ari*_*ian 11 python for-loop dry
假设我有三个列表,我需要遍历它们并对内容做一些事情.
这三个名单streaks_0
,streaks_1
和streaks_2
.对于每个列表,我需要使用特定于每个列表的不同值.例如,streak_0_num0s
在streaks_1
for循环中不起作用.
有没有办法让这三个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)
编写一个可以多次调用的函数:
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)
正如其他人已经说过的那样:当你发现自己多次重复时:尝试创建一个可以重复使用的功能.
然而,看看周围是否有人已经实现了这样的功能总是一个好主意.在您的情况下,您可以使用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)