Составьте новый список в зависимости от номера группы и добавьте оценки. - PullRequest
0 голосов
/ 14 ноября 2018

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

[['Harry',9,1],['Harry',17,1],['Jake',4,1], ['Dave',9,2],['Sam',17,2],['Sam',4,2]]

Как я могу добавить средний элемент вместе, например, для "Гарри", он отображается как ['Harry', 26], а также для Python, чтобы посмотреть на номер группы (3-й элемент) и вывести только победителя (тот, с наибольшим количеством очков, который является средним элементом).Таким образом, для каждой группы должен быть один победитель.Таким образом, окончательный результат показывает:

[['Harry', 26],['Sam',21]]

Этот вопрос не является дубликатом: он также имеет третий элемент, который я застрял около

Подобный вопрос дал мне ответ:

grouped_scores = {}
for name, score, group_number in players_info:
    if name not in grouped_scores:
        grouped_scores[name] = score
        grouped_scores[group_number] = group_number 
    else:
        grouped_scores[name] += score

Но это только прибавляет очки, но не убирает победителя из каждой группы.Пожалуйста, помогите.

Я думал, что делаю что-то подобное, но я точно не знаю, что делать ...

grouped_scores = {}
for name, score, group_number in players_info:
    if name not in grouped_scores:
        grouped_scores[name] = score
    else:
        grouped_scores[name] += score
    for group in group_number:
        if grouped_scores[group_number] = group_number:
            [don't know what to do here]

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Я бы сначала агрегировал данные с defaultdict.

>>> from collections import defaultdict
>>> 
>>> combined = defaultdict(lambda: defaultdict(int))
>>> data = [['Harry',9,1],['Harry',17,1],['Jake',4,1], ['Dave',9,2],['Sam',17,2],['Sam',4,2]]
>>> 
>>> for name, score, group in data:
...:    combined[group][name] += score
...:    
>>> combined
>>> 
defaultdict(<function __main__.<lambda>()>,
            {1: defaultdict(int, {'Harry': 26, 'Jake': 4}),
             2: defaultdict(int, {'Dave': 9, 'Sam': 21})})

Затем примените max к каждому значению в этом диктанте.

>>> from operator import itemgetter
>>> [list(max(v.items(), key=itemgetter(1))) for v in combined.values()]
>>> [['Harry', 26], ['Sam', 21]]
0 голосов
/ 14 ноября 2018

используйте itertools.groupby, а затем возьмите среднее значение из сгруппированного элемента и добавьте его в список, переданный с максимальным условием

import itertools
l=[['Harry',9,1],['Harry',17,1],['Jake',4,1], ['Dave',9,2],['Sam',17,2],['Sam',4,2]]
maxlist=[]
maxmiddleindexvalue=0
for key,value in itertools.groupby(l,key=lambda x:x[0]):
    s=0
    m=0
    for element in value:
        s+=element[1]
        m=max(m,element[1])
    if(m==maxmiddleindexvalue):
        maxlist.append([(key,s)])

    if(m>maxmiddleindexvalue):
        maxlist=[(key,s)]
        maxmiddleindexvalue=m

print(maxlist)

ВЫХОД

[('Harry', 26), [('Sam', 21)]]
0 голосов
/ 14 ноября 2018

Используйте itertools.groupby и collections.defaultdict:

l=[['Harry',9,1],['Harry',17,1],['Jake',4,1], ['Dave',9,2],['Sam',17,2],['Sam',4,2]]
from itertools import groupby
from collections import defaultdict
l2=[list(y) for x,y in groupby(l,key=lambda x: x[-1])]
l3=[]
for x in l2:
    d=defaultdict(int)
    for x,y,z in x:
       d[x]+=y
    l3.append(max(list(map(list,dict(d).items())),key=lambda x: x[-1]))

Сейчас:

print(l3)

Is:

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