ParticionarSequencia

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

ParticionarSequencia (editada pela última vez em 2008-09-26 14:06:39 por localhost)