为了账号安全,请及时绑定邮箱和手机立即绑定

根据组数制作一个新列表并添加分数

根据组数制作一个新列表并添加分数

12345678_0001 2021-08-17 16:01:08
如果在另一个列表中有一个列表,看起来像这样......[['Harry',9,1],['Harry',17,1],['Jake',4,1], ['Dave',9,2],['Sam',17,2],['Sam',4,2]]我如何将中间元素加在一起,例如,对于“Harry”,它会显示['Harry', 26]为 Python 查看组号(第 3 个元素)并仅输出获胜者(得分最高的那个是中间元素)。因此,对于每个组,需要有一个获胜者。所以最终输出显示:[['Harry', 26],['Sam',21]]这个问题不是重复的:它还有第三个元素,我对此很困惑类似的问题给了我一个答案: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但这只是将分数相加,并不会从每组中取出获胜者。请帮忙。我曾想过做这样的事情,但我不确定该怎么做......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]
查看完整描述

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. 然后最后一行来管理如何将该字典变成一个列表。


查看完整回答
反对 回复 2021-08-17
?
ITMISS

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


查看完整回答
反对 回复 2021-08-17
?
慕尼黑的夜晚无繁华

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


查看完整回答
反对 回复 2021-08-17
  • 3 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号