2017-01-16 3 views
0
{'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) и в алфавитном порядке.

+0

Возможный дубликат http://stackoverflow.com/questions/4233476/sort-a-list-by-multiple-attributes – jackarms

ответ

0

Проходит кортеж sorted функции в качестве ключа, отменяют второй элемент (уровень квалификации) для сортировки в порядке убывания, если связи уровня мастерства, он сортируется по работе в порядке возрастания:

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

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

Вы можете отсортировать по двум атрибутам, предоставив аргументу key функцию, возвращающую кортеж. Попробуйте это:

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

Здесь вы делаете x[1] отрицательный внутри кортежа сортировать по уровню квалификации в порядке убывания, а затем порядке возрастания по именам. Это устраняет необходимость в reverse=True.