{'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 )

La fonction who, qui prend comme arguments une base de données, un travail (str), un niveau de compétence minimum (int); il renvoie une liste de 2 tuples: les personnes et leur niveau de compétence, triés par niveau de compétence décroissant. si deux personnes ont le même niveau de compétence, elles doivent apparaître par ordre alphabétique.

Ma fonction est capable de trier la liste avec un niveau de compétence minimum (int), mais ne peut pas trier la liste par ordre alphabétique.

J'ai eu l'erreur suivante:

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

Quelqu'un peut-il m'aider à corriger mon code afin de trier à la fois par le niveau de compétence minimum (int) et par ordre alphabétique.

0
user6952870 16 janv. 2017 à 03:53

2 réponses

Meilleure réponse

Passez un tuple à la fonction sorted comme clé, annulez le deuxième élément (niveau de compétence) pour le trier par ordre décroissant, si le niveau de compétence est égal, il est ensuite trié par emploi dans l'ordre croissant:

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

who(db, "Cleaning", 4)
# [('Charles', 5), ('Adam', 4), ('Diane', 4)]
0
Psidom 16 janv. 2017 à 00:58

Vous pouvez trier sur deux attributs en donnant à l'argument key une fonction qui renvoie un tuple. Essaye ça:

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

Ici, vous rendez x[1] négatif à l'intérieur du tuple pour trier par niveau de compétence dans l'ordre décroissant, puis dans l'ordre croissant pour les noms. Cela élimine le besoin de reverse=True.

0
jackarms 16 janv. 2017 à 00:58