wake-up-neo.com

Erstellen Sie eine neue Liste in Abhängigkeit von der Gruppennummer und addieren Sie ebenfalls Punkte

Wenn eine Liste in einer anderen Liste enthalten ist, die so aussieht ...

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

Wie kann ich das mittlere Element zusammenfügen, so erscheint es für 'Harry' beispielsweise als ['Harry', 26] und auch für Python, um die Gruppennummer (3. Element) zu betrachten und nur den Gewinner auszugeben (derjenige mit der höchsten Punktzahl das mittlere Element). Für jede Gruppe muss es also einen Gewinner geben. Die endgültige Ausgabe zeigt also:

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

DIESE FRAGE IS KEIN DUPLIKAT: Es hat auch ein drittes Element, an dem ich mich festhalte

Die ähnliche Frage gab mir eine Antwort auf:

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

Das addiert jedoch nur die Punktzahlen, es gewinnt nicht den Gewinner aus jeder Gruppe. Bitte helfen.

Ich hatte gedacht, so etwas zu tun, aber ich weiß nicht genau, was ich tun soll ...

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

Verwenden Sie itertools.groupby und 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]))

Jetzt:

print(l3)

Ist:

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

sie können versuchen, Counter und seine Methode most_common zu verwenden.

Gibt eine Liste der n häufigsten Elemente und deren Anzahl von den am häufigsten vorkommenden Bis zu den geringsten zurück

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

werde dir geben:

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

Ich würde die Daten zuerst mit einer defaultdict zusammenfassen.

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

Wenden Sie dann max auf jeden Wert in diesem Diktum an.

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

verwenden Sie itertools.groupby und nehmen Sie den mittleren Wert aus dem gruppierten Element und hängen Sie ihn an eine Liste an, die unter der Maximalbedingung übergeben wird

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)

AUSGABE

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