En tiempo de ejecución no accede al valor en el índice [0] y da error de 'avg' no definido ¿Cómo lo soluciono? Requiere dos valores decimales pero solo da un valor decimal. CÓDIGO A CONTINUACIÓN:

    n = int(input())
    student_marks = {}
    for i in range(n):
        name, *line = input().split()
        scores = list(map(float, line))

        student_marks[name] = scores
        print(scores)
        print(student_marks)
    query_name = input()
    if query_name == name:
        print(query_name)
        avg=0
        avg=sum(scores)/3
    print(avg)

Salida:

    4
    dd 3 34 2 2
    [3.0, 34.0, 2.0, 2.0]
    {'dd': [3.0, 34.0, 2.0, 2.0]}
    g 3 4 5 6
    [3.0, 4.0, 5.0, 6.0]
    {'dd': [3.0, 34.0, 2.0, 2.0], 'g': [3.0, 4.0, 5.0, 6.0]}
    d 3 4 534 34
    [3.0, 4.0, 534.0, 34.0]
    {'dd': [3.0, 34.0, 2.0, 2.0], 'g': [3.0, 4.0, 5.0, 6.0], 'd': [3.0, 4.0, 534.0, 34.0]}
    e 3 4 4 4
    [3.0, 4.0, 4.0, 4.0]
    {'dd': [3.0, 34.0, 2.0, 2.0], 'g': [3.0, 4.0, 5.0, 6.0], 'd': [3.0, 4.0, 534.0, 34.0], 'e': [3.0, 4.0, 4.0, 4.0]}
    dd
    Traceback (most recent call last):
      File "C:/Users/Priya/Desktop/1.py", line 15, in <module>
        print(avg)
    NameError: name 'avg' is not defined
1
Gagan Sharma 7 oct. 2019 a las 08:29

3 respuestas

La mejor respuesta

Modifique su código desde esta línea.

query_name = input()

if query_name in student_marks:
    scores = student_marks[query_name]
    avg = sum(scores) / len(scores)
    print(avg)
else:
    print(f'Student {query_name} does not exist')

Un poco de explicación sobre cómo se definen las variables de Python:
Una variable creada dentro de una cláusula if-else o una loop es accesible fuera del bloque.

Por lo tanto, la razón por la que Python no puede encontrar la variable avg es porque nunca se creó, lo que significa que la condición if no se cumplió. Mientras codifica, intente depurar simplemente poniendo print declaraciones e imprima los valores para ver por qué no se cumple la condición.

A la variable name se le asigna un nuevo valor en cada iteración del ciclo for. Cuando el control abandona el ciclo, el valor de name es el último valor ingresado por el usuario (name = 'e' for the example provided in the question).

Debe verificar si query_name está presente entre todos los nombres ingresados por el usuario, que se pueden encontrar en las teclas del dict student_marks. Una simple verificación de membresía usando el operador in hace el truco.

2
Diptangsu Goswami 7 oct. 2019 a las 06:02

Ponga la declaración avg = 0 fuera del if porque avg no está definido cuando la declaración if no es verdadera.

Entonces, cada vez que la declaración if es falsa, 'avg' no está definido en la declaración 'print (avg)'.

n = int(input())
student_marks = {}
for i in range(n):
    name, *line = input().split()
    scores = list(map(float, line))

    student_marks[name] = scores
    print(scores)
    print(student_marks)
query_name = input()
avg=0
if query_name == name:
    print(query_name)
    avg=sum(scores)/3
print(avg)

Otra forma es proporcionar una instrucción else y asignar un valor a avg allí, pero supongo que no necesita eso.

¡Espero que ayude!

-1
harshit verma 7 oct. 2019 a las 05:40

En lugar de:

if query_name == name:

Quizás quieras hacer:

if query_name in student_marks:    # Check if the query name is in the previously provided student details.

Porque:

nombre, * línea = input (). split ()

if query_name == name:

Significa que si ingresa el nombre de la consulta como el nombre proporcionado por el último alumno, solo irá dentro de if. (Estoy 99.99% seguro de que esto no es lo que quieres).

En su entrada, los estudiantes son: ['dd', 'g', 'd', 'e' ]. Si proporciona el nombre de la consulta como 'e', solo irá dentro de if. Además, si proporciona n = 0, arrojará un error porque el bucle for no se ejecutará y name no existirá. (Estoy 99.99% seguro de que esto no es lo que quieres).


Además:

avg=sum(scores)/3

Debe ser:

avg=sum(student_marks[query_name])/4   # You have four marks and not three.

Entonces, cambie:

query_name = input()
if query_name == name:
    print(query_name)
    avg=0
    avg=sum(scores)/3
print(avg)

Para:

query_name = input()
if query_name in student_marks:
    print(query_name)
    avg=sum(student_marks[query_name])/len(student_marks[query_name])
    print(avg)
else:
    print('Student details does not exist.')
2
Dipen Dadhaniya 7 oct. 2019 a las 06:08
58263931