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

时间:2017-01-16 00:53:39

标签: python

{'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)和按字母顺序排序。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

这里你在元组中使x[1]为负,按技能级别按降序排序,然后按名称升序排序。这消除了对reverse=True的需求。