Ваш код почти не работает, есть синтаксическая ошибка и одна реальная проблема.
Проблема в том, что вы добавляете num
слишком рано. Вы должны суммировать строки, которые содержат имя, которое вы ищете, затем, когда все строки будут видны, добавьте значение:
data_list = [
['pos', 'num', 'name', 'goal', 'assist'],
['FW', '1', 'Khan', '2', '0'],
['FW', '25', 'Daniel', '0', '0'],
['FW', '3', 'Daniel', '1', '0'],
['FW', '32', 'Daniel', '0', '0'],
['FW', '4', 'Khan', '1', '0']
]
name_list = ['Khan', 'Daniel']
goal = []
for name in name_list:
total_score = 0
for j in data_list:
if name == j[2]:
total_score += int(j[3])
goal.append([i, total_score])
С другой стороны, эта стратегия не самая эффективная, поскольку для каждого имени код будет перебирать все строки. Вы можете (используя словари для хранения промежуточных результатов) нуждаться в однократном просмотре каждой строки, независимо от количества «имен», которые вы ищете.
name_list = {'Khan', 'Daniel'}
goal = dict()
for row in data_list:
if row[2] in name_list:
if not row[2] in goal:
goal[row[2]] = 0
goal[row[2]] += int(row[3])
Которая устанавливает goal
в {'Khan': 3, 'Daniel': 1}
.
Тем не менее, это можно улучшить (читаемость), используя defaultdict . По умолчанию словарь выполняет автоматическую проверку существования данного «ключа» и инициализацию, что упрощает код:
from collections import defaultdict
goal = defaultdict(int)
for row in data_list:
if row[2] in name_list:
goal[row[2]] += int(row[3])
Что делает то же самое, что и раньше. В этот момент даже не ясно, действительно ли нам нужно предоставить список имен (если только память не является проблемой). Получение словаря для всех имен снова упростило бы код (нам просто нужно убедиться, что первая строка игнорируется, используя нотацию среза [1:]
):
goal = defaultdict(int)
for row in data_list[1:]:
goal[row[2]] += int(row[3])