potrei fare qualcosa di simile:
chars_i_want = set('atcg')
final_string = ''.join(c for c in start_string if c in chars_i_want)
Questo è probabilmente il modo più semplice per farlo.
Un'altra opzione sarebbe quella di utilizzare str.translate
per fare il lavoro:
import string
chars_to_remove = string.printable.translate(None,'acgt')
final_string = start_string.translate(None,chars_to_remove)
non sono sicuro che sarebbe un rendimento migliore. Dovrebbe essere cronometrato via timeit
per sapere in modo definitivo.
aggiornamento: Tempi!
import re
import string
def test_re(s,regex=re.compile('[^atgc]')):
return regex.sub(s,'')
def test_join1(s,chars_keep=set('atgc')):
return ''.join(c for c in s if c in chars_keep)
def test_join2(s,chars_keep=set('atgc')):
""" list-comp is faster, but less 'idiomatic' """
return ''.join([c for c in s if c in chars_keep])
def translate(s,chars_to_remove = string.printable.translate(None,'acgt')):
return s.translate(None,chars_to_remove)
import timeit
s = 'ag ct oso gcota'
for func in "test_re","test_join1","test_join2","translate":
print func,timeit.timeit('{0}(s)'.format(func),'from __main__ import s,{0}'.format(func))
Purtroppo (per me), regex
vince sulla mia macchina:
test_re 0.901512145996
test_join1 6.00346088409
test_join2 3.66561293602
translate 1.0741918087
Hai vinto :) (+1). Non so perché non ho pensato a regex per questo ... – mgilson
Ho fatto +1 anche a te. La seconda soluzione che hai fornito (str.translate) era nuova per me :) –