10 de novembro de 2008

Transformando string delimitada em uma lista

Outro dia eu recebi uma mensagem que tinha um monte de gente copiada. Daí eu pensei: "eu podia pegar esse monte de e-mails e transformar numa lista, né?"

Então esse é o meu exercício de hoje: pegar uma string delimitada e transformar numa lista.

É claro que podem existir várias formas de fazer isso, mas eu gostaria da ajuda de vocês para escolher a maneira mais pythônica de fazer isso.

Para dar um toque de realidade, eu resolvi ler o monte de e-mails de um arquivo texto e carregar a tal lista. Lembre-se que em uma linha do arquivo, existirão vários endereços de e-mail delimitados por um ponto-e-vírgula.

Segue abaixo o modo como eu resolvi esse problema:


'''Transforma string delimitada em lista'''

print __doc__
f = open('emails.txt')

emails = []
for linha in f:
emails.extend(email.lower().strip() for \
email in linha.split(';'))
f.close()

emails.sort()
for email in emails:
print email


Será que esse é realmente o melhor modo de resolver essa questão?
A misturada de coisa que eu fiz nas linhas 8 e 9 é uma boa forma de fazer um list comprehension?
E o encadeamento dos métodos lower() e strip() ficaram bons?

Particularmente, me pareceu um pouco javânico e perlínico!
Em python seria essa a forma aconselhável de fazer? Ou será que criei um monstrinho?

Sugestão do Elcio Ferreira em 13/11/2008: http://pastie.org/314379
De todas as sugestões que recebi, eu achei essa do Elcio a forma mais compacta de resolver esse problema. Apesar de achá-la um pouco complicada para iniciantes, eu a escolhi por ter vários conceitos em tão pouco código.
Eu consegui ver como um código pode ser pequeno pode abrir e ler um arquivo tranformando-o em uma string (read()). Como também pode transformar uma string em lista (t.replace("\n",";").split(";")). Gostei também da forma de mostrar a lista: print "\n".join(sorted(emails))

Adicionado em 16/11/2008: Apesar de eu ter escolhido essa alternativa, veja o que rolou nessa thread na lista Python Brasil. Principalmente se você é iniciante. A contribuição do Osvaldo Santana me fez abrir a cabeça para alguns detalhes que eu não havia previsto. A do Paul Eipper mostrou que meu exemplo também poderia ser mais resumido um pouco.
Obrigado pela ajuda de vocês. O newbie aqui tá aproveitando prá caramba! ;-)


Me ajuda aí.

Contribua se você tem alguma informação adicional sobre esse assunto ou se encontrou um erro nesse programa. Afinal, ninguém é perfeito, né?
Comente também se esse exemplo ajudou a você de alguma forma. É gratificante saber. :-)
Não deixe de avisar se você encontrou alguma falha de iniciante que precisa corrigir ou melhorar, pois estou aprendendo. Isso ajuda bastante.

Abraço.

3 comentários:

  1. Antes de mais nada a idéia de pegar problemas 'reais' da lista é fenomenal, assim nunca vai faltar assunto para aulas, e assuntos pertinentes, boa sacada!

    Por vezes a solução aparece na lista mas a descrição dos detalhes posta aqui completa o que na lista dificultaria para um iniciante, valeu cara, se achar uma sugestão melhor envio!

    ResponderExcluir
  2. Segue minha versão:

    http://pastie.org/314379

    ResponderExcluir
  3. Então.. gostaria de mudar o tópico aqui, liás, já usei o código em questão.. :) obrigado. Você sabe de alguma lib para fazer conexão com o Oracle? Tentei o cx_Oracle, mas não tive sucesso. Uso windows. Abração.

    ResponderExcluir