1
votes

Question Python simple avec dictionnaires et listes

Le but de la fonction est de faire un ajustement de note basé sur un dictionnaire et une liste. Par exemple,

{'ann': 80, 'bob': 75}

retournera

def adjust_grades(roster, grade_adjustment) 

adjust_grades({'ann': 75, 'bob': 80}, [5, -5])

J'ai juste besoin d'un coup de pouce dans la bonne direction, je suis nouveau sur Python alors j'ai pensé à mettre une boucle for imbriquée pour chaque num dans grade_adjustment mais ce n'est pas la bonne façon.


5 commentaires

Vous devriez essayer de définir votre dictionnaire comme un OrderedDict . Ou définissez votre grade_adjustment comme un dictionnaire: {'ann': 5, 'bob': -5}


@ J.Murray, c'était vrai jusqu'au 3.6. En 3.6, la fonction de préservation de l'ordre était considérée comme un détail de mise en œuvre. Dans 3.7+, la fonction de préservation de l'ordre est garantie


Le grade_adjustment doit également être un dictionnaire. Ensuite, pour le nom, adj dans grade_adjustment.items (): roster [name] + = adj


@Buran Nice! C'est une édition solide. Je pense que je considérerais toujours des alternatives plutôt que de me fier à cela (surtout si vous ne savez pas quelle version de l'interpréteur le code peut être exécuté via)


@Alexander Cela a beaucoup de sens, malheureusement c'est une solution que je ne peux pas utiliser pour cette mission. Cela DOIT être une liste.


4 Réponses :


1
votes

Ceci fait plusieurs hypothèses:

  • le dictionnaire et la liste ont la même longueur (votre code final doit s'assurer qu'ils le font)
  • vous utilisez une version de python dans laquelle l'ordre des clés du dictionnaire est conservé (sinon, vous pouvez également faire de grade_adjustment un dictionnaire, comme mentionné par d'autres commentaires)
result = roster.copy()
for index, key in enumerate(roster):
    result[key] += grade_adjustment[index]


1 commentaires

Ah! Très utile, cela a beaucoup de sens. Je vais essayer ceci, merci.



1
votes

Vous pouvez utiliser

def adjust_grades(roster, grade_adjustment):
    for k, v in enumerate(grade_adjustment):
        roster[list(roster.keys())[k]] = roster[list(roster.keys())[k]] + v
    return roster

Cela donne la sortie comme vous l'avez dit {'ann': 80, 'bob': 75}

p >


1 commentaires

Je vais essayer cela aussi, merci beaucoup pour votre aide!



1
votes

en supposant 3.7 ou dict ordonné et de longueur égale:

def adjust_grades(roster, grade_adjustment):
    return {key:value + adjustment for (key, value), adjustment in
            zip(roster.items(), grade_adjustment)}


print(adjust_grades({'ann': 75, 'bob': 80}, [5, -5]))


0 commentaires

1
votes

En supposant que Python 3.7 (dictés ordonnés) et la longueur des ajustements correspondent à la longueur des éléments du dictionnaire, vous pouvez zippez les ensemble comme suit:

for name, adjustment_amount in zip(roster, grade_adjustment):
    roster[name] += adjustment_amount

>>> roster
{'ann': 80, 'bob': 75}


1 commentaires

Solution très simple et facile à suivre - merci!