associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Seu texto de busca "linkto:"SomarNumerosDeUmArquivoEmUmaLinha"" não retornou nenhum resultado. Por favor mude os termos do texto, para mais informações veja HelpOnSearching.
(!) Considere fazer uma busca completa do texto com seus próprios termos.

Excluir mensagem

SomarNumerosDeUmArquivoEmUmaLinha

Receita: Somando números de um arquivo com uma linha de código

Em um documento que explica o uso da linguagem Icon, tem um interessante exemplo de programa que computa a soma de todos os números de um arquivo (estes, separados por espaços), os números podem estar dispersos em várias linhas. Um arquivo de exemplo seria:

10 30 5
5
2 54 2 76 4 2
2 4 
3
4 5 6 20 12

Em Icon o programa ficaria assim:

every sum +:= !split(!&input, ' \t')

Aonde "input" é a stream de entrada.

Código

Este é o código para Python 2.2 e 2.3:

   1 print sum([sum([int(s) for s in l.split()]) for l in __import__("sys").stdin])

Para o Python 2.4 podemos utilizar 'generator expressions' para fazer a mesma coisa. Com isso temos um código muito mais 'escalável' (palavra bonita), pois não será necessário alocar uma lista com strings e outra com inteiros para cada linha do arquivo (imagine isso para um arquivo bem grande). Eis o código:

   1 print sum((sum((int(n) for n in sn)) for sn in (linha.split() for linha in __import__("sys").stdin)))

Usar as características de linguagens funcionais que Python traz consigo torna a programação muito mais rica e empolgante, além de servir como um divertido exercício.

Comentário (por João Paulo F Farias)

Achei uma forma mais simples:

   1 sum(map(int, __import__('sys').stdin.read().split()))

:P

Uma forma mista (Bogdano), para Python2.4:

   1 sum((int(n) for n in __import__('sys').stdin.read().split()))

As duas formas acima são muito mais simples, porém consomem muita memória, pois 'split()' gera uma lista com todos os números do arquivo (uma saída seria ler em blocos), e no primeiro caso mais uma lista com os inteiros (gerada por 'map()').

Volta para CookBook.


BogdanoArendartchuk