Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Solução] Filtrando números pares

import re

def validar_string_de_inteiros(texto: str) -> bool:
    """
    Verifica se uma string é composta exclusivamente por números INTEIROS
    (com ou sem sinal) separados por um ou mais espaços.

    A validação é feita token a token, garantindo que cada parte
    corresponda exatamente ao padrão de um número inteiro.

    Args:
        texto (str): A string a ser validada, contendo tokens separados por espaço.

    Returns:
        bool: True se todos os tokens forem números inteiros válidos, False caso contrário.
    """
    
    REGEX_POR_NUMERO = re.compile(r'^[-+]?\d+$')

    texto_limpo: str = texto.strip()

    if not texto_limpo:
        return False
    
    tokens: list[str] = re.split(r'\s+', texto_limpo)

    for token in tokens:
        if not REGEX_POR_NUMERO.fullmatch(token):
            return False
    
    return True

def converter_string_para_lista_de_inteiros(string_numeros: str) -> list[int]:
    """
    Converte uma string de números INTEIROS (separados por espaço)
    em uma lista de números inteiros (int).

    Args:
        string_numeros (str): A string contendo os números a serem convertidos.

    Returns:
        list[int]: Uma lista contendo os valores inteiros.

    Raises:
        ValueError: Se a string falhar na validação (contiver tokens não numéricos,
                    decimais ou separadores inválidos).
    """

    if not validar_string_de_inteiros(string_numeros):
        raise ValueError(
            'A string contém formatos não correspondentes a números inteiros ou separadores múltiplos não permitidos.'
        )

    string_limpa: str = string_numeros.strip()
    tokens: list[str] = re.split(r'\s+', string_limpa)
    
    try:
        return [int(token) for token in tokens]
    except ValueError:
        raise ValueError('Erro ao tentar converter o token para [int]')

def main() -> None:
    entrada: str = ''
    lista_de_numeros_inteiros: list[int] = []
    lista_de_numeros_pares: list[int] = []
    numeros_pares: list[str] = []

    while True:
        try:
            entrada = input('\nDigite os números separados por espaço (apenas inteiros): ').strip()
            lista_de_numeros_inteiros = converter_string_para_lista_de_inteiros(entrada)
            break
        except ValueError as e:
            print(f'\n{e}')
    
    try:
        lista_de_numeros_pares = list(filter(lambda x: x % 2 == 0, lista_de_numeros_inteiros))
        numeros_pares = list(map(str, lista_de_numeros_pares))
    except ValueError:
        print('\nErro ao filtrar números pares')
        exit(1)

    if numeros_pares:
        print(f'\nNúmeros pares: {' '.join(numeros_pares)}')
    else:
        print('Não foram encontrados números pares.')


if __name__ == '__main__':
    main()

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas
solução!

Oi, Mozert! Como vai?

Gostei da validação por tokens com re.fullmatch e do fluxo claro entre validar_string_de_inteirosconverter_string_para_lista_de_inteirosmain. Ajuste um detalhe no print final: no f-string print(f'\nNúmeros pares: {' '.join(numeros_pares)}') as chaves internas conflitam; resolva trocando para print('\nNúmeros pares:', ' '.join(numeros_pares)).

Outra ideia simples: o try/except envolvendo filter não é necessário, pois x % 2 não levanta ValueError quando x já é int. Uma dica interessante para o futuro é usar list comprehension para filtrar pares de forma direta. Veja este exemplo:


entrada = "1 2 3 4 5 -6"
pares = [n for n in map(int, entrada.split()) if n % 2 == 0]
print("Numeros pares:", " ".join(map(str, pares)))

Esse código usa map(int, ...) para converter os tokens e filtra com if n % 2 == 0, depois imprime em linha única com " ".join(...).

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Opa. Tudo certo, Armano!
Muito obrigado pelas dicas.
Essa resolução com list comprehension ficou show.!

pares = [n for n in map(int, entrada.split()) if n % 2 == 0]