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