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.
Em meus testes, a versão part2() chega a ser duas vezes mais rápida que a part().
Volta para CookBook.