#python #python-3.x
Вопрос:
Я написал функцию для вычисления среднего значения списка, и, исключая нули, mean_val(
) — это функция, которая должна выводить 5.2200932159502855
, но вместо этого она выводит 6.525116519937857
, хотя ее формула та же самая.
mean_val2
Функция имеет правильный вывод: 5.2200932159502855
но эта функция не исключает нули.
Как сделать mean_val()
вывод 5.2200932159502855
, одновременно исключив нули из списка и сохранив его в этом формате для цикла?
Вот код код тестирования:
val = [4, 3, 5, 0, 9, 3, 6, 0, 14, 15]
val1 = [4, 3, 5, 9, 3, 6, 14, 15]
def mean_val2(val1):
sum = 0
for i in val1:
print(i)
sum = 1 / i
output = len(val1)/sum
return output
def mean_val(val):
sum = 0
for i in val:
if i != 0:
print(i)
sum = 1 / i
output2 = len(val)/sum
return output2
mean_out2 = mean_val2(val1) # 5.2200932159502855 correct output
mean_out = mean_val(val) # 6.525116519937857
print (mean_out, mean_out2)
Комментарии:
1. Ваш отступ выключен. Вы хотели не отступать: .
outputx = len(valx)/sum
Так, как у вас есть, в последний раз черезfor
циклoutputx
не обновляется.2. @quamrana он по-прежнему выводит то же самое, никакой разницы.
3. Хорошо, но ваш отступ все еще выключен. У вас излишний расчет.
Ответ №1:
Значения len
val и val1 различны.
len(val)
это 10.
len(val1)
составляет 8
Когда вы разделите len/sum
, вы получите другой результат.
Вы можете добавить счетчик, чтобы отслеживать длину обрабатываемых элементов:
val = [4, 3, 5, 0, 9, 3, 6, 0, 14, 15]
val1 = [4, 3, 5, 9, 3, 6, 14, 15]
def mean_val2(val1_param):
total = 0
for i in val1_param:
total = 1 / i
output = len(val1_param) / total
return output
def mean_val(val_param):
total = 0
non_zero_length = 0
for i in val_param:
if i != 0:
total = 1 / i
non_zero_length = 1
output2 = non_zero_length / total
return output2
mean_out2 = mean_val2(val1)
mean_out = mean_val(val)
print(mean_out, mean_out2)
print(mean_out == mean_out2)
Выход:
5.2200932159502855 5.2200932159502855
True
Общие примечания:
- Вы не должны использовать имя переменной
sum
, так как оно затеняет имя встроенной функции sum. Я изменил его на total в измененном коде. - Ваши аргументы функции не должны иметь то же имя, что и ваши списки, определенные в глобальной области. Я добавил
_param
суффикс, но более значимое имя переменной было бы лучше.
Вы также можете повторно использовать свои функции. Вместо того, чтобы выполнять аналогичную обработку в обоих случаях, вы могли бы вместо этого отфильтровать 0 в своем списке и передать их своей mean_val2
функции
def mean_val(val_param):
return mean_val2([i for i in val_param if i != 0])
def mean_val2(val1_param):
total = 0
for i in val1_param:
total = 1 / i
output = len(val1_param) / total
return output
Как Понимание:
def mean_val(lst):
# Filter Out 0 Elements From List
return mean_val2([i for i in lst if i != 0])
def mean_val2(lst):
# Process List with No Zeros
return len(lst) / sum([1 / i for i in lst])
Ответ №2:
Я бы использовал одну функцию для обоих списков:
val = [4, 3, 5, 0, 9, 3, 6, 0, 14, 15]
val1 = [4, 3, 5, 9, 3, 6, 14, 15]
def mean_val(val=[]) -> float:
sum_rec = 0
zeros = 0
for i in val:
if i != 0:
print(i)
sum_rec = 1 / i
else:
zeros = 1
output2 = (len(val) - zeros) / sum_rec
return output2
mean_out2 = mean_val(val1) # 5.2200932159502855 correct output
mean_out = mean_val(val) # 5.2200932159502855 correct output
print (mean_out, mean_out2)