Já que acabaste por criar uma classe para criar os pokémons, em vez de armazerar os dados em atributes criaria um atributo para cada dado para ser guardado:

class Pokemon:
    def __init__(self, name, atk, defense, hp, speed):
    self.name = name
    self.Attack = atk
    self.Defense = defense
    self.HP = hp
    self.Speed = speed
    
pokemon = Pokemon(Bulbasaur, 49, 49, 45, 45)

Assim para acessar os dados passamos depokemon.atributes["Attack"] parapokemon.Attack.

Só uma sugestão, na mesma um bom trabalho e espero que aprendas bastante com este projeto.

Com certeza, a única coisa que poderia ser diferente na sua sugestão é que, ao invés de passar cada atributo como prop, apenas desestruturar no init:

class Pokemon:
    def __init__(self, name, attibutes):
        self.name = name
        
        for attr_key, attr_value in attributes.items():
            # Example: self.HP = attributes["HP"]
            self.__dict__[attr_key] = attr_value

Desse jeito não ficaria tão verboso e facilitaria na hora de implementar novos atributos.

Por acaso não sabia que se podia fazer assim, muito massa