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:
1.def remove_1(item,seq):
2.    """Retira todas as ocorrências do item da sequência."""
3.    aux = []
4.    for elem in seq:
5.        if elem != item:
6.            aux.append(elem)
7.    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:
1.def remove_2(item,seq):
2.    """Seq é uma lista."""
3.    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:
1.def remove_3(item, seq):
2.    """se for uma cadeia de caracteres."""
3.    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.
01.def remove_4(item, seq):
02.    """Lista ou tuplo ou cadeia de caracteres."""
03.    if isinstance(seq,str):
04.        return seq.replace(item,'')
05.    elif isinstance(seq,list):
06.        return [elem for elem in seq if elem != item]
07.    elif isinstance(seq,tuple):
08.        return tuple([elem for elem in seq if elem != item])
09.    else:
10.        print 'TypeError'
11.        return seq

E pronto, já está!

Sem comentários:

Enviar um comentário