3 回答

TA贡献1757条经验 获得超8个赞
解决方案:
使用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)
是:
[['Harry', 26], ['Sam', 21]]
解释:
前两行是导入模块。然后下一行groupby用于根据每个子列表的最后一个元素分为两组。然后下一行创建空列表。然后下一个循环遍历分组的循环。然后创建一个defaultdict. 然后子循环将内容添加到defaultdict. 然后最后一行来管理如何将该字典变成一个列表。

TA贡献1871条经验 获得超8个赞
我会先用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]]

TA贡献1864条经验 获得超6个赞
使用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)]]
添加回答
举报