簡體   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