quarta-feira, 30 de dezembro de 2009

O saber remove montanhas

Consideremos o problema simples de retirar todas as ocorrências de um item de uma sequência.

Podemos começar com uma solução simples:

def remove_1(item,seq):
"""Retira todas as ocorrências do item da sequência."""
aux = []
for elem in seq:
if elem != item:
aux.append(elem)
return aux

Mas que só funciona para listas e tuplos. E, neste último caso, transforma o tuplo numa lista. Claro que se apenas tivermos que manipular listas ainda podemos optar pela solução que usa listas por compreensão:

def remove_2(item,seq):
"""Seq é uma lista."""
return [elem for elem in seq if elem != item]

Então e se for um cadeia de caracteres? Podemos usar a função pré-definida replace:

def remove_3(item, seq):
"""se for uma cadeia de caracteres."""
return seq.replace(item,'')

Mas podemos juntar tudo num único programa? Claro que sim! Só precisamos de fazer um teste ao tipo do objecto, e para isso usamos o comando isinstance.

def remove_4(item, seq):
"""Lista ou tuplo ou cadeia de caracteres."""
if isinstance(seq,str):
return seq.replace(item,'')
elif isinstance(seq,list):
return [elem for elem in seq if elem != item]
elif isinstance(seq,tuple):
return tuple([elem for elem in seq if elem != item])
else:
print 'TypeError'
return seq

E pronto, já está!

Sem comentários:

Enviar um comentário