Home Foros Foro dudas Foro Python Ejercicio video 022 – Solución con lo visto hasta el momento

Ejercicio video 022 – Solución con lo visto hasta el momento

Viendo 3 entradas - de la 1 a la 3 (de un total de 3)
  • Autor
    Entradas
  • #20821

    Hola a todos, añado aqui una solución al ejercicio planteado en el video 022 – Bucles y diccionarios, resuelto con lo que hemos visto hasta el momento, sin utilizar setdefault(), para aquel que lo haya intentado resolver así, como yo y le pueda interesar. Un saludo a todos alumnos

    # 022 - Bucles y diccionarios
    # Ejercicio 01 - JMP
    
    # CLAVE:VALOR
    
    # Escribir un programa que vaya pidiendo pais (clave) y ciudad (valor) para crear un diccionario
    # Esto se repetirá hasta que en el pais introduzcamos "salir" donde acabará presentará el diccionario.
    # Si introducimos varias ciudades de un mismo pais, estas, formarán parte de una lista de valores de la
    # clave del país correxpondiente
    
    
    # Definimos el diccionario, vacío al principio del programa
    ciudades={}
    
    while True:
    
        # Introduce el país y la ciudad
        # Si pais = "Salir" termina el bucle infinito e imprime el diccionario
        pais = input("Introduce un país: ")
        if pais == "salir":
            break
    
        ciudad = input("introduce una ciudad: ")
    
        # Definimos una lista vacía de ciudades
        Listaciudades=[]
    
        # Utilizamos una variable BOOL para saber si hemos encontrado el pais
        # Inicialmente le damos valor False
        paisencontrado = False
    
        # Recorremos el diccionario buscando el país que hemos introducido
        for i in ciudades:
            # Pais encontrado en las claves del dicionario
            if i == pais:
                # Asignamos a listaciudades (que es una lista vacia) el valor de la clave pais
                Listaciudades = ciudades[pais]
                # Comprobamos si la ciudad introducida ya está en la lista de ciudades de la clave pais
                if ciudad not in Listaciudades:
                    # Como no está, añadimos la ciudad introducida a la lista de ciudades
                    # que contiene la lista anteriormente introducida
                    Listaciudades.append(ciudad)
                    # Ahora actualizamos la CLAVE:VALOR del pais con la nueva lista de ciudades actualizada
                    ciudades[pais] = Listaciudades
                # Indicamos en la variable BOOL de apoyo que = True porque hemos encontrado el pais
                # (hayamos o no encontrado la ciudad)
                paisencontrado = True
    
        # Una vez terminado de recorrer el diccionario (terminado el for) miramos si hemos encontrado el pais
        # con la variable BOOL paisencontrado que estará a True si hemos encontrado el pais
        if not paisencontrado:
            # Al no haber econtrado el pais, hemos de añadir al diccionario la nueva CLAVE:VALOR
            # Añadimos a lista ciudades la ciudad introducida (solo tendrá ese valor, porque la lista estaba vacía)
            Listaciudades.append(ciudad)
            # Añadimos, ahora sí, el nuevo pais (CLAVE) con su ciudad en forma de lista (VALOR) al diccionario
            ciudades[pais] = Listaciudades
    
    # Imprimimos el diccionario en pantalla
    print(ciudades)
    

     

    #21870

    Pablo Aparicio
    Participante

    Yo hice esto, también sin usar el setdefault(), de lo que aún tengo que tomar notas porque era algo totalmente nuevo.

     

    print("Países y ciudades") #Sólo a modo de titular
    
    capitales= {} #Creo el diccionario llamado "capitales", aunque creo que debería haber elegido mejor el nombre
    
    pais="" #Inicio la variable "país" con una cadena vacía.
    
    while pais!="salir": #mientras "país" no sea "salir", y entra porque inicia como vacío
        pais = input("Introduce un país: ") #Se pedirá que se introduzca un país.
        if pais == "salir": #Si ese país es "salir"
            break "Se sale del bucle"
        ciudad = input("Introduce ciudad: ") #Si no se sale del bucle, continúa con el flujo de ejecución preguntando por una ciudad.
    
        if pais in capitales: #si el país introducido está en el diccionario "capitales"
            capitales[pais].append(ciudad) #A ese país se le añade un el valor con el nombre de la ciudad en forma de lista (eso hace append()).
        else: #Si el país introducido no está en "capitales".
            capitales[pais]=[ciudad] #Sencillamente se añade el país al diccionario.
    
    
    print(capitales) #Imprimir el diccionario "capitales"

     

    Creo que está bien. No diré el tiempo que me tiré para conseguirlo porque no sé si es algo bueno o malo. O sí, más de 3 horas haciendo pruebas. Por eso me gustaría leer alguna opinión de alguien que pudiera decirme si está bien, si no o en qué se puede mejorar. Yo suelo cometer el error de que comparado con otros códigos, los míos suelen poder estar mejor optimizados. Además, en este caso, si lo primero que ponemos es “salir”, imprimirá las llaves del diccionario, aunque vacío.

     

    Y también aprovecho este post para presentarme por aquí.

    #21871

    Pablo Aparicio
    Participante

    Como no encuentro cómo editar, respondo con correcciones en las explicaciones del último condicional:

    Es que si el país introducido está en el diccionario “capitales”, se añadirá a la lista de ciudades la ciudad introducida. Si es un país nuevo, creará una nueva “clave:valor”, y como “ciudad” está ahí entre corchetes, se añadirá la ciudad iniciando una lista para el valor del país introducido.

    No sé si me explico bien. O quizá sea más fácil leerlo si la segunda parte la pongo en el “if” y la primera en el “else”. La idea es que si el país introducido es uno nuevo, añade al diccionario el país como clave y la ciudad como valor, un valor que es una lista porque va entre corchetes. Como los valores (ciudades) son una lista, los nuevos valores se pueden añadir a las mismas con append().

Viendo 3 entradas - de la 1 a la 3 (de un total de 3)
  • Debes estar registrado para responder a este debate.