Diccionario con varios valores en una clave con Python (10)

En esta entrada vamos a revisar como crear un diccionario en el cual una misma clave tiene varios valores. Para esto vamos a usar la función setdefault revisada en una entrada anterior.

Supongamos que necesitamos crear un diccionario cuyas claves sean las letras del abecedario y sus valores las palabras que empizan con dicha letra.

diccionario = {}
diccionario.setdefault('a', []).append('arbol')
diccionario.setdefault('b', []).append('boca')
diccionario.setdefault('c', []).append('cabeza')
diccionario.setdefault('a', []).append('azul')
diccionario.setdefault('a', []).append('armadillo')
diccionario.setdefault('c', []).append('casa')
diccionario.setdefault('a', []).append('arbol')

Con esto tenemos el siguiente diccionario:

{'a': ['arbol', 'azul', 'armadillo','arbol'], 
'b': ['boca'], '
c': ['cabeza', 'casa']}

En este ejemplo se combino un diccionario con una lista para los valores, como puedes ver se permiten valores repetidos; en el caso de requerir que los valores no se repitan veamos un ejemplo en el cual se usa en lugar de la lista un diccionario.

diccionario = {}
diccionario.setdefault('a', {})['arbol']=1
diccionario.setdefault('b', {})['boca']=1
diccionario.setdefault('c', {})['cabeza']=1
diccionario.setdefault('a', {})['azul']=1
diccionario.setdefault('a', {})['armadillo']=1
diccionario.setdefault('c', {})['casa']=1
diccionario.setdefault('a', {})['arbol']=1

Ahora veamos como arbol solo apare una vez.

{'a': {'arbol': 1, 'azul': 1, 'armadillo': 1},
'b': {'boca': 1},
'c': {'cabeza': 1, 'casa': 1}}

EP 04 – La resistencia Indígena ante la conquista – Anacaona Historias Cuentos y Algo +

Resumen del libro "La resistencia indígena ante la conquista" de Libro de Josefina Oliva Teixell.Si quieres apoyar al canal puedes enviar tus donativos a:https://www.paypal.com/paypalme/pasacallepodcastEscoger la opción enviar. Gracias de antemano.
  1. EP 04 – La resistencia Indígena ante la conquista – Anacaona
  2. EP 03 – La resistencia Indígena ante la conquista – Colón, oro y esclavos – Guarionex, Guacanagarí, Caonabo, Behechio
  3. EP 02 – La resistencia Indígena ante la conquista – El Encuentro
  4. EP 01 – La resistencia Indígena ante la conquista – Josefina Oliva de Coll
  5. EP 11 – Geopolítica del hambre – El reverendo Malthus y la selección natural

La funcion setdefault en Python (9)

En esta entrada vamos a revisar el uso de la función setdefault en los diccionarios de python.

setdefault() Parameters

setdefault() takes a maximum of two parameters:

  • key – the key to be searched in the dictionary
  • default_value (optional) – key with a value default_value is inserted to the dictionary if the key is not in the dictionary.
    If not provided, the default_value will be None.

Esta función nos permite agregar una nueva clave a un diccionario en caso de no encontrarse en el mismo, caso contrario, devuelve el valor de clave ingresada, veamos:

indice = {}
indice.setdefault('Edwin', 1)
print(indice)

Out: {'Edwin': 1}

En este caso, Edwin no existía, por lo que lo agrega, ahora veamos que pasa si volvemos a intentar ingresar Edwin.

indice.setdefault('Edwin', 2)

Out: 1

Como Edwin ya existe, entonces nos devuelve el valor de Edwin: 1.

Ahora veamos un ejemplo de como utilizar setdefault para ir agregando valores a un diccionario.

Ejemplo:

Tenemos un diccionario de estudiantes, en el cual vamos a ir ingresado el estudiante y sus notas. Las notas se registran dentro de una lista.

notas = {}

def agregarNota(estudiante, nota):
    notas.setdefault(estudiante, []).append(nota)

agregarNota('Luis', 7)
agregarNota('Edwin', 8)
agregarNota('Luis', 9)
agregarNota('Edwin', 5)
agregarNota('Luis', 5)

print(notas)

Out: {'Luis': [7, 9, 5], 'Edwin': [8, 5]}

La primera vez que recibe Luis, lo agrega, para cuando vuelve a ingresar a Luis, como ya existe, entonces agrega la nueva nota.

Setdefault es bastante util en diccionarios cuyos valores son listas, vamos a profundizar con otro ejemplo en la próxima entrada.

EP 04 – La resistencia Indígena ante la conquista – Anacaona Historias Cuentos y Algo +

Resumen del libro "La resistencia indígena ante la conquista" de Libro de Josefina Oliva Teixell.Si quieres apoyar al canal puedes enviar tus donativos a:https://www.paypal.com/paypalme/pasacallepodcastEscoger la opción enviar. Gracias de antemano.
  1. EP 04 – La resistencia Indígena ante la conquista – Anacaona
  2. EP 03 – La resistencia Indígena ante la conquista – Colón, oro y esclavos – Guarionex, Guacanagarí, Caonabo, Behechio
  3. EP 02 – La resistencia Indígena ante la conquista – El Encuentro
  4. EP 01 – La resistencia Indígena ante la conquista – Josefina Oliva de Coll
  5. EP 11 – Geopolítica del hambre – El reverendo Malthus y la selección natural

Obtener el valor de un diccionario – Funcion Get (8)

Vamos a obtever el valor de un diccionario, sin tener que manejar un expeción cuando la clave no se encuentre en el diccionario, por ejemplo, sin utilizar if/else.

Tenemos el diccionario:

d = {'clave':'valor'}

Ahora extramos el valor usando if/else y, posteriormente obtendremos lo mismo sin if/else:

if 'clave' in d:
    print (d['clave'])
    
else:
    print ('clave no encontrada')

Esto mismo lo podemos hacer de manera sencilla con la función get.

d.get('clave','clave no encontrada')

EP 04 – La resistencia Indígena ante la conquista – Anacaona Historias Cuentos y Algo +

Resumen del libro "La resistencia indígena ante la conquista" de Libro de Josefina Oliva Teixell.Si quieres apoyar al canal puedes enviar tus donativos a:https://www.paypal.com/paypalme/pasacallepodcastEscoger la opción enviar. Gracias de antemano.
  1. EP 04 – La resistencia Indígena ante la conquista – Anacaona
  2. EP 03 – La resistencia Indígena ante la conquista – Colón, oro y esclavos – Guarionex, Guacanagarí, Caonabo, Behechio
  3. EP 02 – La resistencia Indígena ante la conquista – El Encuentro
  4. EP 01 – La resistencia Indígena ante la conquista – Josefina Oliva de Coll
  5. EP 11 – Geopolítica del hambre – El reverendo Malthus y la selección natural

Bagels – Adivina el número | Python

En esta entrada vamos a revisar la implementación del juego Bagels en Python. Este juego consiste en adivinar un numero de 3 dígitos.

Como funciona:

Bagels es un juego de deducción que puedes jugar con un amigo. Tu amigo piensa en un número aleatorio de 3 dígitos sin dígitos repetidos y tú intentas adivinar cuál es el número. Después de cada intento, tu amigo te da tres tipos de pistas:

  • Bagels: Ninguno de los tres dígitos que adivinó está en el número secreto.
  • Pico: Uno de los dígitos está en el número secreto, pero su conjetura tiene el dígito en el lugar equivocado.
  • Fermi: Tu conjetura tiene un dígito correcto en el lugar correcto.

Nota: En matemáticas, el concepto de conjetura se refiere a una afirmación o una proposición que se supone cierta, pero que no ha sido demostrada ni refutada hasta la fecha.​​​​

Ahora vamos con la implementación del código:

import random

NUM_DIGITS = 3 # Numero de digitos del número a adivinar
MAX_GUESSES = 10 # Número de intentos

def main():
    print('''Implementación del juego bagels
        Estoy pensando en un número de {} digitos, cuyos digitos no se repiten
        Cuando diga:
            Pico    Uno de los dígitos está en el número secreto, pero su conjetura tiene el dígito en el lugar equivocado.
            Fermi   Tu conjetura tiene un dígito correcto en el lugar correcto.
            Bagels  Ninguno de los tres dígitos que adivinó está en el número secreto.
                    
    '''.format(NUM_DIGITS))
    
    while True: # Bucle principal del juego
        #Almacenar el número secreto generado de manera aleatoria
        secretNum = getSecretNum()                        
        print('He pensado un número.')
        print('Tienes {} intentos para conseguirlo.'.format(MAX_GUESSES))
        
        numGuesses = 1
        while numGuesses <= MAX_GUESSES:
            guess = ''
            #Se mantiene el bucle hasta que se ingrese una conjetura valida
            while len(guess) != NUM_DIGITS or not guess.isdecimal():
                print('Conjetura #{}: '.format(numGuesses))
                #Tomar la conjetura ingresada por el usuario
                guess = input('> ')
                
                #Obtenemos las pistas
                clues = getClues(guess, secretNum)
                print(clues)
                numGuesses += 1
                
            if guess == secretNum:
                break #Si es correctos sale del bucle
            
            if numGuesses > MAX_GUESSES:
                print('Número de conjeturas consumidas')
                print('La respuesta era {}.'.format(secretNum))
        
        #Preguntar si el jugador quiere volver a jugar
        print('Deseas volver a jugar? (si o no)')
        if not input('> ').lower().startswith('s'):
            break
        
    print ('Gracias por jugar')

def getSecretNum():
    """Devuelme una cadena formada por un número aleatorio de digitos"""
    numbers = list('0123456789') #Creamos una lista de digitos del 0 al 9
    random.shuffle(numbers) #Barajamos la lista en orden aleatorio
    
    #Obtenemos los primeros números de la lista que seran utilizados para el juego
    secretNum = ''
    for i in range(NUM_DIGITS):
        secretNum += str(numbers[i])
        
    return secretNum
    

def getClues(guess, secretNum):
    """ Devuelve una cadena con las pistas: Pico, Fermi y Bagels """
    if guess == secretNum:
        return "Acertaste!"
    
    clues = []
    
    for i in range(len(guess)):
        if guess[i] == secretNum[i]:
            #Una conjetura correcta en el lugar correcto
            clues.append('Fermi')
            print(clues)
        elif guess[i] in secretNum:
            #Una conjetura correcta en el lugar incorrecto
            clues.append('Pico')
            print(clues)
    
    #No existe ningúna conjetura correcta
    if len(clues) == 0:
        return 'Bagels' 
    else:
        #Clasifica las pistas en orden alfabetico para que su orden original no revele información
        clues.sort()
        #Regresamos una sola cadena
        return ' '.join(clues)

#Ejecutar el juego
if __name__=='__main__':
    main()

https://amzn.to/48ggISV

¿Cuáles son los beneficios de usar Python?

Python es uno de los lenguajes más poderosos usado incluso por empresas como Google. Entre los beneficios podemos encontrar los siguientes:

  • Eficiencia: Python es muy eficiente en el uso de memoria. Útil para programas que usen grandes conjuntos de datos como Dig Data.
  • Más Rápido: A pesar de que en Python el código es interpretado, es conocido por su alto rendimiento en cuanto a velocidad.
  • Ampliamente usado: Es utilizado en diferentes organizaciones para diferentes proyectos. Debido a esta amplitud puedes encontrar miles de complementos.
  • Fácil de aprender: Es un lenguaje muy fácil de aprender. Esto es algo de lo más reconocido para Python. Tareas que podrían parecer complejas son más fáciles de implementar en Python.

Pilas en Python | Stack in Python

Una pila es una estructura de datos lineal que almacena los elementos en modo Last In First Out (LIFO). En la pila se puede agregar un nuevo elemento (PUSH) o remover un elemento (POP), el elemento agregado o removido siempre corresponde al elemento de la cima (TOP) de la pila.

Para una pila vacía el valor del elemento TOP es -1. Cuando se inicializa una pila configuramos este valor en -1 de tal manera que podamos verificar si la pila esta vacía.

Operaciones en las pilas

  1. Operación de apilamiento (PUSH): Agrega un nuevo elemento a la cima de la pila. En esta operación se debe verificar si la pila aún no se ha llenado
  2. Operación de desapilar (POP): Remueve el elemento de la cima de la pila. En esta operación se debe verifica si a pila no esta vacía.
  3. Consultar (PEEK or TOP): Retorna el valor de la cima de la pila.
  4. estaVacía (isEmpty): Verifica si la pila esta vacía.
  5. estaLlena (isFull): Verifica si la pila esta llena.

Desbordamiento y subdesbordamiento de la pila

  • Desbordamiento (Overflow): Si la pila esta llena, entonces se dice que la pila esta desbordada. En otras palabra, esto ocurre cuando tratamos de agregar un nuevo elemento cuando se ha superado el máximo permitido.
  • Subdesbordamiento (Underflow): Si la pila esta vacía decimo que está subdesbordada. En otras palabras, esto ocurre cuando tratamos de remover un elemento cuando no hay elementos (TOP = -1).

Implementando una pila

"""

Timosoft: 22/02/2023

"""

class Stack:    
    def __init__(self, size):
        #inializamos la pila  TOP=-1
        self.stack = []
        self.maxSize = size
        self.top = -1
        
    #Apilar elementos
    def push(self, x):
        if self.top == self.maxSize - 1:
            print('Stack Overflow')
        else:
            self.x = x
            self.stack.append(x)
            self.top += 1
    
    #Desapilar/quitar elementos
    def pop(self):
        if self.top == -1:
            print('Stack underflow')
        else:
            self.stack.pop()
            self.top -= 1
    
    def isEmpty(self):
        print(self.top == -1)
        
    def isFull(self):
        print(self.top == self.maxSize-1)
    
    def peek(self):
        print(self.stack[-1])
    
    def displayElements(self):
        #range(start, stop, step)
        for i in range(self.top, -1, -1):
            print(self.stack[i])

#Declaramos una pila de 3 elementos            
stackObj = Stack(3)
#Agreamos 3 elementos
stackObj.push(1)
stackObj.push(2)
stackObj.push(3)
#Mostramos los elementos
stackObj.displayElements()
#Verificamos si la pila esta llena
stackObj.isFull()
#Removemos un elemento
stackObj.pop()
#Mostramos los elementos
stackObj.displayElements()
#Verificamos si la pila esta llena
stackObj.isEmpty()
#Consultamos el elemento de la cima
stackObj.peek()

Resultado:

3
2
1
True
2
1
False
2

Espero que te sirva este ejemplo, no olvides visitar nuestro contenido.