Для циклов в Python, чтобы найти сумму списка - PullRequest
0 голосов
/ 06 февраля 2019

У меня вопрос по поводу списков в python.В настоящее время у меня есть некоторый код, который выглядит следующим образом:

muaverage = (w[0] * mu[0] + w[1] * mu[1])

, где w и mu оба списка, содержащие 2 переменные.Хотя w и mu содержат только две переменные, код работает нормально, однако я хотел бы добавить больше значений в эти списки, для чего итерация по спискам для нахождения суммы представляется наиболее подходящей.Я попытался выполнить следующие действия:

for i in range(0,len(mu)):
    muaverage = sum(w[i] * mu[i])

, но это выдает ошибку.Любой совет будет оценен!

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы, кажется, находитесь после (внутреннего) точечного произведения между mu и w.Чтобы реализовать это самостоятельно, просто обратитесь к ответу @tobias_k.Однако в стандартном пакете для числовых массивов в Python, т.е. NumPy, функция dot() или оператор @ (в Python> = 3.5) будут выполнять то, что вы запрашиваете, то есть (внутреннее) скалярное произведение.

import numpy as np

# define some dummy objects
mu = list(range(0, 10))
w = list(range(10, 20))

muaverage = sum(x * y for x, y in zip(mu, w))
# muaverage == 735

muaverage = np.dot(mu, w)
# muaverage == 735

# operands of `@` should be `numpy.array()`
mu = np.array(mu)
w = np.array(w)
muaverage = mu @ w
# muaverage == 735

Но ваше наименование предполагает, что, возможно, вы находитесь после средневзвешенного значения, для которого вы бы использовали average(), который принимает параметр weight, например,

import numpy as np

# define some dummy objects
mu = list(range(0, 10))
w = list(range(10, 20))

muaverage = np.average(mu, weights=w)
# muaverage == 5.068965517241379

muaverage = np.dot(mu, w) / np.sum(w)
# muaverage == 5.068965517241379

(ИЗМЕНЕНО для лучшего включения np.dot()).

0 голосов
/ 06 февраля 2019

Есть две проблемы с вашим кодом:

  • вы перезаписываете предыдущее значение muaverage в каждой итерации
  • вы пытаетесь получить sum изодно числовое значение

Вместо этого вы можете либо использовать обычный цикл for:

muaverage = 0                  # initialize before the loop
for i in range(0,len(mu)):
    muaverage += w[i] * mu[i]  # add to current value with +=

или использовать sum с выражением генератора:

muaverage = sum(w[i] * mu[i] for i in range(len(mu)))

или sum и zip, как , предложенное @ yatu :

muaverage = sum(x * y for x, y in zip(w, mu))

Обратите внимание, чтоmuaverage на самом деле не средний;для этого вам все равно придется разделить его на количество элементов или сумму весов (?) в w для средневзвешенного значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...