Как добавить числа в дублирующий список - PullRequest
0 голосов
/ 17 июня 2020

Я собрал данные из txt файла и внес их в список (на самом деле игроков намного больше, так что без l oop подсчитать невозможно), например:

data_list = [
['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']
]

и я хочу добавить цель каждого Хана и Даниила и составить список вроде:

['Khan', 3]
['Daniel', 1]

У меня есть список имен (name_list = [Khan, Daniel])

Я пытался сделать с для l oop, например:

goal = []
num = 0
for i in name_list:
        for j in data_list:
                if i == j[2]:
                        num += int(j[3])
                        goal.append([i, num])
                else:
                        continue

, и это не сработало. Я очень новичок, поэтому ваши комментарии мне очень помогут. Спасибо!

Ответы [ 4 ]

3 голосов
/ 17 июня 2020

Ваш код почти не работает, есть синтаксическая ошибка и одна реальная проблема.

Проблема в том, что вы добавляете 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])
2 голосов
/ 17 июня 2020

Вы можете создать словарь, чтобы сохранить общее количество целей с именами в качестве ключей. Это упростит доступ к значениям:

goals_dict = {}
for name in name_list:
    goals_dict[name] = 0
# {'Khan': 0, 'Daniel': 0}

Затем просто просуммируйте:

for name in name_list:
    for data in data_list:
        if data[2] == name:
            goals_dict[name] += int(data[3])

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

result = [[key, value] for key, value in d.items()]
1 голос
/ 17 июня 2020

Не трудитесь делать это вручную. Используйте вместо Counter:

from collections import Counter

c = Counter()
for j in data_list:
    name = j[2]
    goal = int(j[3])
    c[name] += goal

print(c.most_common())  # -> [('Khan', 3), ('Daniel', 1)]
1 голос
/ 17 июня 2020

В приведенном выше коде вы увеличиваете значение num без его предварительного определения. Вы захотите инициализировать его 0 вне вашего внутреннего для l oop. Затем вы добавляете имя / цель в список следующим образом:

for i in name_list:
    #Init num
    num = 0
    # Iterate through each data entry
    for j in data_list:
        if i == j[2]:
            # Increment goal count for this player
            num+= int(j[3])
    # Append final count to goal list
    goal.append([i, num])

Это должно иметь желаемый эффект, хотя, как указал @wjandrea, Counter будет гораздо более чистой реализацией.

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