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

Diferenças para "AchaMaiorLinhaEmArquivo"

Diferenças entre as versões de 1 e 12 (11 versões de distância)
Revisão 1e 2004-05-05 13:35:38
Tamanho: 1727
Comentário:
Revisão 12e 2008-09-26 14:07:43
Tamanho: 2738
Editor: localhost
Comentário: converted to 1.6 markup
Deleções são marcadas assim. Adições são marcadas assim.
Linha 2: Linha 2:
= Receita: Acha maior linha em arquivo=
=
= Receita: Acha maior linha em arquivo ==

''RodrigoVieira''
Linha 7: Linha 10:
Nas linhas 12 e 13, onde eu preciso pegar o maior número dentro de uma lista, eu estou ordenando a lista em ordem decrescente e então pegando o primeiro valor. Acredito que haja uma forma mais elegante de fazer isso, algo como max(lista), mas ainda não encontrei..estou aberto a sugestões (sinta-se livre pra alterar o código diretamente e cortar essa parte do comentário...)

Sou capaz de jurar que as linhas 7-16 podem ser reduzidas a 1 linha, só não sei como ainda :)
Sou capaz de jurar que as linhas 2-16 podem ser reduzidas a 1 linha, só não sei como ainda :)
Linha 16: Linha 17:
    #extrai as linhas do arquivo em uma lista     # extrai as linhas do arquivo em uma lista
Linha 18: Linha 19:
    linhas_arquivo = [linha for linha in arquivo]     linhas_arquivo = [ linha for linha in arquivo ]
Linha 21: Linha 22:
    #cria uma lista com o comprimento de cada linha
    compr_linhas = [len(linha) for linha in linhas_arquivo]
    # cria uma lista com o comprimento de cada linha
    compr_linhas = [ len(linha) for linha in linhas_arquivo ]
Linha 24: Linha 25:
    #ordena a lista em ordem decrescente
    #(outra forma de fazer isso seria usar um .sort() e depois um .reverse())
    compr_linhas.sort(lambda x,y: cmp(y,x))
    compr_maior_linha = compr_linhas[0]
    # acha o maior numero dentro da lista de comprimentos,
    # ou seja, qual é o comprimento da maior linha
    compr_maior_linha = reduce(lambda x,y: max(x,y), compr_linhas)
Linha 29: Linha 29:
    #retorna todas as linhas que tenham o comprimento da maior linha
    maior_linha = [linha for linha in linhas_arquivo if len(linha)==compr_maior_linha]
    # retorna todas as linhas que tenham o comprimento da maior linha
    maior_linha = [ linha for linha in linhas_arquivo
                   
if len(linha)==compr_maior_linha ]
Linha 34: Linha 35:
    print str(achaMaiorLinhaEmArquivo("meu_aquivo.txt"))     print "\n".join(achaMaiorLinhaEmArquivo("meu_arquivo.txt"))
}}}
Linha 36: Linha 38:
== Tudo Em Uma Linha ==

''FelipeLessa''

Sim, sim... é possível colocar tudo em uma só linha =). Acho que isso deve funcionar:

{{{
#!python
achaMaiorLinhaEmArquivo = lambda f:reduce(lambda x,y:x[0]>y[0]and x or y,\
                           [(len(l), l)for l in file(f).readlines()])[1]

if __name__ == "__main__":
    print achaMaiorLinhaEmArquivo("meu_arquivo.txt")
Linha 37: Linha 52:

E se você quiser que seja devolvida o tamanho da linha também, é só você retirar o {{{[1]}}} que tem no final:

{{{
#!python
achaMaiorLinhaEmArquivo = lambda f:reduce(lambda x,y:x[0]>y[0]and x or y,\
                             [(len(l), l)for l in file(f).readlines()])

if __name__ == "__main__":
    print "A maior linha tem %d caracteres e é:\n%s" % \
           achaMaiorLinhaEmArquivo("meu_arquivo.txt")
}}}

A única diferença é que esta função retorna apenas a primeira maior linha, e não todas as linhas que compartilham do maior tamanho. Mas como o nome da função está no singular ("acha maior linha em arquivo"), acredito que isso sirva.

Caso você venha me dizer que essa função não tem uma linha, e sim duas, é porque aqui no Wiki não fica bem uma linha com mais de 80 caracteres, então eu tive de quebrá-la, mas nada o impede de juntar de novo em uma só =).
Linha 42: Linha 73:
RodrigoVieira RodrigoVieira, FelipeLessa

Receita: Acha maior linha em arquivo

RodrigoVieira

Eu precisava de uma função que retornasse, dentro de um arquivo .txt, a maior linha (linha de maior comprimento). Talvez seja útil para mais alguém. Esse código também pode ser facilmente adaptado para retornar qual a maior string dentro de uma lista (só tirar a parte relativa à abertura de arquivo).

Sou capaz de jurar que as linhas 2-16 podem ser reduzidas a 1 linha, só não sei como ainda :)

Código

   1 def achaMaiorLinhaEmArquivo(nome_arquivo):
   2     # extrai as linhas do arquivo em uma lista
   3     arquivo = file(nome_arquivo)
   4     linhas_arquivo = [ linha for linha in arquivo ]
   5     arquivo.close()
   6     
   7     # cria uma lista com o comprimento de cada linha
   8     compr_linhas = [ len(linha) for linha in linhas_arquivo ]
   9     
  10     # acha o maior numero dentro da lista de comprimentos,
  11     # ou seja, qual é o comprimento da maior linha
  12     compr_maior_linha = reduce(lambda x,y: max(x,y), compr_linhas)
  13     
  14     # retorna todas as linhas que tenham o comprimento da maior linha
  15     maior_linha = [ linha for linha in linhas_arquivo
  16                     if len(linha)==compr_maior_linha ]
  17     return maior_linha
  18     
  19 if __name__ == "__main__":
  20     print "\n".join(achaMaiorLinhaEmArquivo("meu_arquivo.txt"))

Tudo Em Uma Linha

FelipeLessa

Sim, sim... é possível colocar tudo em uma só linha =). Acho que isso deve funcionar:

   1 achaMaiorLinhaEmArquivo = lambda f:reduce(lambda x,y:x[0]>y[0]and x or y,\
   2                            [(len(l), l)for l in file(f).readlines()])[1]
   3 
   4 if __name__ == "__main__":
   5     print achaMaiorLinhaEmArquivo("meu_arquivo.txt")

E se você quiser que seja devolvida o tamanho da linha também, é só você retirar o [1] que tem no final:

   1 achaMaiorLinhaEmArquivo = lambda f:reduce(lambda x,y:x[0]>y[0]and x or y,\
   2                              [(len(l), l)for l in file(f).readlines()])
   3 
   4 if __name__ == "__main__":
   5     print "A maior linha tem %d caracteres e é:\n%s" % \
   6            achaMaiorLinhaEmArquivo("meu_arquivo.txt")

A única diferença é que esta função retorna apenas a primeira maior linha, e não todas as linhas que compartilham do maior tamanho. Mas como o nome da função está no singular ("acha maior linha em arquivo"), acredito que isso sirva.

Caso você venha me dizer que essa função não tem uma linha, e sim duas, é porque aqui no Wiki não fica bem uma linha com mais de 80 caracteres, então eu tive de quebrá-la, mas nada o impede de juntar de novo em uma só =).

Volta para CookBook.


RodrigoVieira, FelipeLessa