繁体   English   中英

如何通过两个不同的键对列表进行排序?

[英]how to sort a list by two different keys?

{'Adam': {('Cleaning',4), ('Tutoring',2), ('Baking',1)},
'Betty': {('Gardening',2), ('Tutoring',1), ('Cleaning',3)},
'Charles': {('Plumbing',2), ('Cleaning',5)},
'Diane': {('Laundry',2), ('Cleaning',4), ('Gardening',3)}}

def who(db : {str:{(str,int)}}, job: str, min_skill : int) -> [(str,int)]:
    result = []
    if type(min_skill) != int:
        raise AssertionError
    if min_skill < 0 or min_skill > 5:
        raise AssertionError
    for key,value in db.items():
        for item in value:
            if item[0] == job and item[1] >= min_skill:
                result.append((key,item[1]))
    return sorted(result,key = lambda x: x[1],reverse = True )

who函数,它将数据库,工作(str),最低技能水平(int)作为参数; 它返回一个2元组的列表:人员及其技能水平,按技能水平递减排序。 如果两个人的技能水平相同,则应按字母顺序显示。

我的函数能够以最低技能水平(int)对列表进行排序,但是无法按字母顺序对列表进行排序。

我收到以下错误:

*Error: who(db,'Cleaning' ,4) -> [('Charles', 5), ('Diane', 4), ('Adam', 4)] but should -> [('Charles', 5), ('Adam', 4), ('Diane', 4)]

有人可以帮助我修复我的代码,以便按最低技能水平(int)和字母顺序进行排序。

将一个元组传递给已sorted函数作为键,否定第二个元素(技能级别)以降序对其进行排序,如果技能级别绑定,则按作业将其按升序进行排序:

sorted(result,key = lambda x: (-x[1], x[0]))

who(db, "Cleaning", 4)
# [('Charles', 5), ('Adam', 4), ('Diane', 4)]

您可以通过为key参数提供一个返回元组的函数来对两个属性进行排序。 尝试这个:

return sorted(result, key = lambda x: (-x[1], x[0]))

在这里,您可以在元组内部使x[1]负,以按技能级别降序排列,然后按名称的升序排列。 这消除了对reverse=True的需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM