web-dev-qa-db-fra.com

Faites une nouvelle liste en fonction du numéro de groupe et ajoutez également les scores

Si un a une liste dans une autre liste qui ressemble à ceci ...

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

Comment puis-je additionner l’élément central, donc pour 'Harry' par exemple, il s’affiche sous la forme ['Harry', 26]? l'élément du milieu). Donc, pour chaque groupe, il doit y avoir un gagnant. Donc, le résultat final montre:

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

CETTE QUESTION IS N'EST PAS UN DUPLICATA: Il a aussi un troisième élément sur lequel je suis coincé

La question similaire m'a donné une réponse de:

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

Mais cela ne fait qu'ajouter les scores, cela ne veut pas dire que le gagnant de chaque groupe. S'il vous plaît aider.

J'avais pensé faire quelque chose comme ça, mais je ne sais pas exactement quoi faire ...

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]
6
user10650570

Utilisez itertools.groupby et 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]))

À présent:

print(l3)

Est:

[['Harry', 26], ['Sam', 21]]
6
U9-Forward

vous pouvez essayer d'utiliser Counter et sa méthode most_common

Retourne une liste des n éléments les plus communs et leurs nombres à partir du le plus commun au moins

from collections import Counter
l = [['Harry',9,1],['Harry',17,1],['Jake',4,1], ['Dave',9,2],['Sam',17,2],['Sam',4,2]]
step = 3
results = list()
for x in range(0, len(l), step):
    cnt = Counter()
    for y in l[x: x+step]:
        cnt.update({y[0]: y[1]})
    results.append(cnt.most_common(1)[0])

te donnera:

print(results)
[('Harry', 26), ('Sam', 21)]
0
Bear Brown

Je voudrais d'abord regrouper les données avec un 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})})

Appliquez ensuite max à chaque valeur de ce dict.

>>> from operator import itemgetter
>>> [list(max(v.items(), key=itemgetter(1))) for v in combined.values()]
>>> [['Harry', 26], ['Sam', 21]]
0
timgeb

utilisez itertools.groupby puis prenez la valeur médiane de l'élément groupé, puis ajoutez-la à une liste transmise à la condition maximale

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)

SORTIE

[('Harry', 26), [('Sam', 21)]]
0
Albin Paul