El objetivo de la función es hacer un ajuste de calificación basado en un diccionario y una lista. Por ejemplo

def adjust_grades(roster, grade_adjustment) 

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

Volverá

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

Solo necesito un empujón en la dirección correcta, soy nuevo en Python, así que pensé en poner un bucle anidado para cada número en grade_adjustment, pero no es la forma correcta.

1
Alexander Swan 28 sep. 2019 a las 21:56

4 respuestas

La mejor respuesta

Suponiendo que Python 3.7 (dictados ordenados) y la longitud de los ajustes coinciden con la longitud de los elementos en el diccionario, puede comprimirlos juntos de la siguiente manera:

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

>>> roster
{'ann': 80, 'bob': 75}
1
Alexander 28 sep. 2019 a las 19:14

Esto está haciendo varias suposiciones:

  • el diccionario y la lista tienen la misma longitud (su código final debe asegurarse de que lo hagan)
  • está utilizando una versión de python en la que se conserva el orden de las teclas del diccionario (si no, también puede hacer que grade_adjustment sea un diccionario, como se menciona en otros comentarios)
result = roster.copy()
for index, key in enumerate(roster):
    result[key] += grade_adjustment[index]
1
pauliner 28 sep. 2019 a las 19:06

Puede usar

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

Esto da salida como dijiste {'ann': 80, 'bob': 75}

1
Prashant Godhani 28 sep. 2019 a las 19:08

Suponiendo 3.7 o dict ordenado e igual longitud:

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]))
1
buran 28 sep. 2019 a las 19:12
58149378