TransWikia.com

Imprimir vários números com um separador entre eles, mas não colocar o separador após o último

Stack Overflow em Português Asked by Pedro Bernardo on August 7, 2020

Faça um programa que leia dois números inteiros, representando os valores inicio e fim de um intervalo e imprima os múltiplos de 5 entre eles.

Meu código:

valores = input().split()    
numero1 = int(valores[0])    
numero2 = int(valores[1])    
for n in range(numero1, numero2+1):

    if n % 5 == 0:

        print(n, end='|')

Notem que os números são separados por |, mas não pode ter esse caractere depois do último número.

2 Answers

Uma alternativa é usar join:

print('|'.join(str(n) for n in range(numero1, numero2 + 1) if n % 5 == 0))

Apesar de parecer a mesma coisa da outra resposta, tem uma diferença. Lá foi criada uma lista contendo os números, depois esta lista foi passada para join. Aqui eu passei diretamente a generator expression, que não cria a lista. Assim, o join itera pelos números e já vai construindo a string final (não que vá ter aquela diferença de performance - ainda mais para ranges com poucos valores - mas é importante saber que você pode construir o que precisa sem criar listas - ou quaisquer outras estruturas - sem necessidade).


Mas na verdade existe outra forma de otimizar o código. Se a ideia é imprimir apenas os múltiplos de 5, não tem porque o range ser de 1 em 1 e ir testando se cada número é divisível por 5 (já que entre 2 múltiplos, outros 4 números serão testados sem necessidade). Em vez disso, você pode simplesmente começar em um múltiplo de 5 e fazer o range ir de 5 em 5:

numero1 = # ler o número
numero2 = # ler o número

# se não for múltiplo de 5, ajustar para o próximo múltiplo
resto = numero1 % 5
if resto != 0:
    numero1 += 5 - resto

# range pula de 5 em 5
print('|'.join(map(str, range(numero1, numero2 + 1, 5))))

Dessa forma, eu só preciso testar se o primeiro número é divisível por 5. Se for, não precisa fazer nada. Se não for, eu ajusto para o próximo múltiplo (por exemplo, se for 7, ajusto para 10). Como agora eu sei que estou começando com um múltiplo de 5, o range pode iterar de 5 em 5, e assim eu não preciso testar dentro do loop se os números são divisíveis por 5 (na verdade nem precisa mais do for: eu posso passar o range diretamente, pois agora ele só terá múltiplos de 5).

Uma alternativa ao join é imprimir o range diretamente:

numero1 = # ler o número
numero2 = # ler o número

# se não for múltiplo de 5, ajustar para o próximo múltiplo
resto = numero1 % 5
if resto != 0:
    numero1 += 5 - resto

print(*range(numero1, numero2 + 1, 5), sep='|')

Note o asterisco antes do range: ele serve para fazer o unpacking dos valores do range (é como se eu passasse cada um deles separadamente para print), e o parâmetro sep indica o caractere que será impresso entre os elementos (é mais ou menos o que a outra resposta sugeriu, mas sem precisar criar a lista).


Outra alternativa é usar enumerate, que itera pelos números e seus respectivos índices. Assim, você não imprime o caractere | somente para o primeiro elemento:

numero1 = # ler o número
numero2 = # ler o número

# se não for múltiplo de 5, ajustar para o próximo múltiplo
resto = numero1 % 5
if resto != 0:
    numero1 += 5 - resto

for i, n in enumerate(range(numero1, numero2 + 1, 5)):
    if i > 0: # não é o primeiro número, coloca o separador
        print('|', end='')
    print(n, end='')

Ou não use o índice, simplesmente verifique se o número é igual ao primeiro:

numero1 = # ler o número
numero2 = # ler o número

# se não for múltiplo de 5, ajustar para o próximo múltiplo
resto = numero1 % 5
if resto != 0:
    numero1 += 5 - resto

for n in range(numero1, numero2 + 1, 5):
    if n != numero1: # não é o primeiro número, coloca o separador
        print('|', end='')
    print(n, end='')

Correct answer by hkotsubo on August 7, 2020

Sem considerar que você não está tratando o input, uma maneira fácil de juntar os números seria colocando todos eles em uma lista de strings e usar o método join() para imprimir o resultado.

Esse método é esperto o suficiente para fazer exatamente o que você quer, ou seja, só colocar o separador entre os elementos.

O código do laço for e da condição if fica todo em uma compreensão de lista. Cada elemento é convertido para o tipo str, para que o join() funcione.

Ficaria assim:

valores = input().split()    
numero1 = int(valores[0])    
numero2 = int(valores[1])

lista = [str(n) for n in range(numero1, numero2+1) if n % 5 == 0]

print('|'.join(lista)) 

Answered by Guilherme Brügger on August 7, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP