В общем, распространенная идея новичка заключается в том, что у вас может быть индекс в имени переменной. Это на самом деле вызывает больше проблем, чем стоит, поскольку имена переменных являются строками. Помимо относительной сложности доступа к переменным по динамически генерируемым именам, у вас есть такие вещи, как a_2
после a_10
и необходимость решить, является ли имя переменной a_10
или a_0010
.
Для этого у вас есть структура данных, называемая списком, которая позволяет вам получить доступ к элементам, используя фактическое целое число в одном месте. Вы можете хранить свои номера в паре списков:
c = [1, 2, 3, 4, 5]
f = [0.1, 0.3, 0.2, 0.5, 0.4]
Теперь вы можете получить доступ к данным c[0]
, ..., c[4]
, а не c_1
, ..., c_5
. Индекс начинается с нуля.
Если ваши данные всегда связаны таким образом, вы также можете отразить это в структуре. Вместо двух списков вы можете выбрать один список из двух кортежей:
cf = [(1, 0.1), (2, 0.3), (3, 0.2), (4, 0.5), (5, 0.4)]
Теперь то, что вы называли c_1
до того, будет первым элементом первого кортежа: cf[0][0]
. Точно так же f_5
будет вторым элементом последнего кортежа: cf[4][1]
.
Сумма продуктов, которые вы пытаетесь вычислить, может быть вычислена на основе любого расположения данных:
sum(i * j for i, j in zip(f, c))
OR
sum(i * j for i, j in fc)
Выражение, которое мы передаем sum
, называется выражением генератора. Обычно он заключен в круглые скобки, кроме случаев, когда это единственный аргумент функции. Выражение будет лениво давать вычисленный продукт из каждой пары элементов.
Если вы много анализируете данные, вы можете заглянуть в вычислительные библиотеки Python. Наиболее фундаментальным из них является numpy, который позволяет хранить данные в плотно упакованных массивах и выполнять над ними быстрые векторизованные операции.
Чтобы преобразовать список в массив:
f = np.array(f)
c = np.array(c)
Сумма продуктов теперь просто для продукта:
c.dot(f)
Или вы можете вычислить это "вручную":
(c * f).sum()
В качестве альтернативы, вы можете сделать
fc = np.array(fc)
fc
теперь будет матрицей из двух столбцов, поэтому вы можете сделать что-то вроде:
fc[:, 0].dot(fc[:, 1])
OR
fc.prod(axis=1).sum()