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

Diferenças para "ParticionarSequencia"

Diferenças entre as versões de 2 e 6 (4 versões de distância)
Revisão 2e 2004-11-03 01:32:19
Tamanho: 2216
Editor: RudaMoura
Comentário:
Revisão 6e 2008-09-26 14:06:39
Tamanho: 2320
Editor: localhost
Comentário: converted to 1.6 markup
Deleções são marcadas assim. Adições são marcadas assim.
Linha 1: Linha 1:
#pragma section-numbers off ## page was renamed from ParticionarSeqüência
Linha 4: Linha 4:
Apresento nesta receita duas formas diferentes, em Pyhton, de particionar uma seqüência (lista, tupla, string) em uma lista, os elementos dessa lista são os valores originais da seqüência divididos em um tamanho máximo dado. Por exemplo, {{{'abcdefg'}}} retornaria {{{['abc', 'def', 'g']}}} para o tamanho máximo 3. Apresento nesta receita duas formas diferentes, em Python, de particionar uma seqüência (lista, tupla, string) em uma lista, os elementos dessa lista são os valores originais da seqüência divididos em um tamanho máximo dado. Por exemplo, {{{'abcdefg'}}} retornaria {{{['abc', 'def', 'g']}}} para o tamanho máximo 3.
Linha 6: Linha 6:
Esta receita teve uma motivação simples: um usuário do #python-br (irc.freenode.net) desejava imprimir em uma impressora fiscal, cujo o tamanho máximo de impressão é de, digamos, 30 caracteres. Então, para uma string de tamanho arbitrário, deve-se quebrar a string em pedaços com no máximo 30 caracteres, para sair corretamente na impressora fiscal. O resultado está em parte aqui, pois deseja-se no final, uma única string com quebra de linhas entre elas. Esta receita teve uma motivação simples: um usuário do #python-br (irc.freenode.net) desejava imprimir em uma impressora fiscal, cujo o tamanho máximo de impressão é de, digamos, 30 caracteres. Então, para uma string de tamanho arbitrário, deve-se quebrar a string em pedaços com no máximo 30 caracteres para sair corretamente na impressora fiscal. O resultado está em parte aqui, pois deseja-se no final uma única string com quebra de linhas entre elas.
Linha 51: Linha 51:
Este exemplo, além de mostrar como usar a função part(), também exibe como inserir as quebras de linhas necessárias para a impressão em papel. Este exemplo, além de mostrar como usar a função {{{part()}}}, também exibe como inserir as quebras de linhas necessárias para a impressão em papel.
Linha 62: Linha 62:
Em meus testes, a versão part2() chega a ser duas vezes mais rápida que a part(). Em meus testes, a versão {{{part2()}}} chega a ser duas vezes mais rápida que a {{{part()}}}.

Receita: Particionar uma Seqüência

Apresento nesta receita duas formas diferentes, em Python, de particionar uma seqüência (lista, tupla, string) em uma lista, os elementos dessa lista são os valores originais da seqüência divididos em um tamanho máximo dado. Por exemplo, 'abcdefg' retornaria ['abc', 'def', 'g'] para o tamanho máximo 3.

Esta receita teve uma motivação simples: um usuário do #python-br (irc.freenode.net) desejava imprimir em uma impressora fiscal, cujo o tamanho máximo de impressão é de, digamos, 30 caracteres. Então, para uma string de tamanho arbitrário, deve-se quebrar a string em pedaços com no máximo 30 caracteres para sair corretamente na impressora fiscal. O resultado está em parte aqui, pois deseja-se no final uma única string com quebra de linhas entre elas.

Código

   1 # part.py
   2 def part(seq, max):
   3     """Particiona uma sequencia 'seq' em uma lista de 'max' elementos de seq.
   4         
   5     Exemplo:   
   6     >>> print part.part('abcdefgh', 3)
   7     ['abc', 'def', 'gh']
   8     """
   9     i, l = 0, []
  10     while seq[i:i+max]:
  11         l.append(seq[i:i+max])
  12         i += max
  13     return l
  14 
  15 # Versao mais rapida
  16 def part2(seq, max):
  17     return [seq[x:x+max] for x in range(0, len(seq), max)]
  18 
  19 def test():
  20     assert part('abcdefgh', 3) == ['abc', 'def', 'gh']
  21     assert part2('abcdefgh', 3) == ['abc', 'def', 'gh']
  22 
  23 def benchmark():
  24     import time
  25     s = 'abcdefgh' * 500000
  26     x = time.time()
  27     part(s, 5)
  28     print time.time() - x
  29     x = time.time()
  30     part2(s, 5)
  31     print time.time() - x
  32 
  33 if __name__ == '__main__':
  34     test()
  35     benchmark()

Exemplo de uso

Este exemplo, além de mostrar como usar a função part(), também exibe como inserir as quebras de linhas necessárias para a impressão em papel.

   1 import part
   2 s = 'python eh legal' * 100  # repete 100x a mesma mensagem
   3 l = part.part2(s, 30) # quebra em 30
   4 l2 = [x+'\n' for x in l] # insere quebra de linha
   5 print ''.join(l2) # transforma em uma única string, com quebra de linhas

Em meus testes, a versão part2() chega a ser duas vezes mais rápida que a part().

Volta para CookBook.


RudaMoura