1727
Comentário:
|
← Revisão 12e 2008-09-26 14:07:43 ⇥
2738
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
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
Sim, sim... é possível colocar tudo em uma só linha =). Acho que isso deve funcionar:
E se você quiser que seja devolvida o tamanho da linha também, é só você retirar o [1] que tem no final:
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.