KeyError en Python (Programa para guardar partidos)

Iniciado por ThePaquet1, 11 Febrero 2021, 20:21 PM

0 Miembros y 1 Visitante están viendo este tema.

ThePaquet1

Buenas, tengo un programa que pide partidos con equipos y sus sets, calcula quien gana para otorgarle 3 puntos y lo guarda en un diccionario (tanto el nombre del equipo como los puntos que consiguen al ganar) para luego mostrarlo en un resultado final. Está constantemente pidiendo partidos hasta que introduzco la palabra FIN. Funciona de la siguiente forma:
Introduces 2 equipos con sus respectivos sets en la misma línea separados por espacios:
equipoA 1 equipoB 2 //El equipoA tiene 1 set y el equipoB tiene 2, por lo que el equipoB gana 3 puntos.
equipoB 4 equipoC 3 //equipoB tiene más sets, por lo que vuelve a ganar 3 puntos (ya lleva 6 por el anterior partido).
equipoD 2 equipoA 3 //equipoA gana, por lo que obtiene 3 puntos

El problema es que al introducir ese último equipo, me salta un error el cuál no entiendo:
Traceback (most recent call last):
 File "(Ruta del archivo)", line 16, in <module>
   diccionario[partido[2]] = diccionario[partido[0]] + 3
KeyError: 'equipoD'


Este es el código completo:

Código (python) [Seleccionar]

[code]diccionario = {}
puntos1 = 0
puntos2 = 0
parar = ""
while parar != "FIN":
   partido = list(map(str, input("Introduzca un partido: ").split()))
   if partido[0] != "FIN":
       pal1 = partido[0]
       equipo1 = partido[0]
       puntos1 = partido[1]
       equipo2 = partido[2]
       puntos2 = partido[3]
       if puntos1 > puntos2 and partido[0] in diccionario:
           diccionario[partido[0]] = diccionario[partido[0]] + 3
       elif puntos1 < puntos2 and partido[2] in diccionario:
           diccionario[partido[2]] = diccionario[partido[0]] + 3
       elif puntos1 > puntos2:
           diccionario[partido[0]] = 3
           diccionario[partido[2]] = 0
       elif puntos2 > puntos1:
           diccionario[partido[2]] = 3
           diccionario[partido[0]] = 0
       else:
           print("No puede haber empates en un partido de pádel.")
       parar = partido[0]
   else:
       break
print("Equipo ganador: " + max(diccionario, key=diccionario.get))
print("Resultados de la liga:")
print(diccionario)


Sin embargo, hay a veces que el programa sí funciona si, por ejemplo, introduzco esto:
madrid 3 barcelona 2
betis 4 getafe 5
madrid 4 getafe 3
FIN
Equipo ganador: madrid
Resultados de la liga:
{'madrid': 6, 'barcelona': 0, 'getafe': 3, 'betis': 0}

He visto que si en el tercer partido no pongo un equipo repetido, me sale el error. ¿Alguien entiende por qué?

Además de esto, tengo otro error, y es que la idea del programa es que si un equipo gana un partido, gana 3 puntos como expliqué antes, pero si pierde, no gana ni pierde puntos, pero mi programa cuando un equipo pierde un partido, le establece los puntos a 0, en vez de simplemente dejarle su puntuación normal.
¿Alguien entiende por qué tengo ambos errores? ¡Muchas gracias por la ayuda![/code]

tincopasan

#1
no entiendo bien la lógica que usas, pero lo modifico y probalo:
Código (python) [Seleccionar]

#-*- coding: utf -8 -*-
diccionario = {}
parar = ""
while parar != "FIN":
   partido = list(map(str, input("Introduzca un partido: ").split()))
   if partido[0] != "FIN":
       equipo1 = partido[0].capitalize()
       puntos1 = int(partido[1])
       equipo2 = partido[2].capitalize()
       puntos2 = int(partido[3])
       if puntos1 > puntos2:
           if not equipo2 in diccionario:
               diccionario[equipo2] = 0
           if not equipo1 in diccionario:
               diccionario[equipo1] = 3
           else:
               puntos = diccionario.get(equipo1)
               diccionario[equipo1] = puntos + 3
       elif puntos1 < puntos2:
           if not equipo1 in diccionario:
               diccionario[equipo1] = 0
           if not equipo2 in diccionario:
               diccionario[equipo2] = 3
           else:
               puntos = diccionario.get(equipo2)
               diccionario[equipo2] = puntos + 3            
       else:
           print("No puede haber empates en un partido de pádel.")
       parar = partido[0]
   else:
       break

print("Equipo ganador: " + max(diccionario, key=diccionario.get))
print("Resultados de la liga:")
print(diccionario)



Edito:

¿para qué todo esto?:
Código (python) [Seleccionar]
partido = list(map(str, input("Introduzca un partido: ").split()))

si esto es lo mismo:

Código (python) [Seleccionar]
partido = input("Introduzca un partido: ").split()

esto ya lo había comentado en otro post, si fuiste vos se ve que no te interesa lo que te digan, sino fuiste vos , es un código redundante el tuyo.

ThePaquet1

¡Hola! Muchísimas gracias por responder a mi duda y arreglar el código. La cosa es que soy totalmente nuevo en Python y al intentar hacer este programa estuve comiéndome el coco y no conseguí arreglar el programa entero (antes ni si quiera sabía como crear el diccionario).

Llevo un tiempo sin pasarme por aquí y tampoco me suena haber preguntado algo sobre ese input, a si que imagino que no he sido yo (si he sido yo y no me acuerdo perdón porque probablemente ni lo haya visto)

De nuevo, muchísimas gracias por la ayuda con el código, con Python me cuesta muchísimo más encontrar información que con Java, es por eso que a veces me veo obligado a pedir ayuda a gente con conocimientos muy por encima de los míos. Gracias  ;D