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]
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]]
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)]
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]]
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)]]