2010-08-27 2 views
1

У меня есть список:питон: держать символ, только если он находится в этом списке

a = ['a','b','c'.........'A','B','C'.........'Z'] 

и у меня есть строка:

string1= 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r' 

я хочу сохранить только те символы, в string1, которые существуют в a

Что является наиболее эффективным способом для этого? возможно, вместо того, чтобы иметь a быть списком, я должен просто сделать его строкой? a='abcdefg..........ABC..Z' ??

ответ

5
''.join([s for s in string1 if s in a]) 

Объяснение:

[s for s in string1 if s in a] 

создает список всех символов в string1, но только если они находятся также в списке а.

''.join([...]) 

возвращает его обратно в строку, соединяя его ничем ('') между элементами данного списка.

+0

+1 для синхронности! – jathanism

+1

Извините, можете объяснить, как это работает chaver? –

+1

добавленный информация. –

3

List comprehension на помощь!

wanted = ''.join(letter for letter in string1 if letter in a) 

(Обратите внимание, что при передаче списка понимания к функции можно опустить скобки, так что полный список не генерируются до оцениваемого. В то время как семантический же, как список понимание, это называется generator expression.)

+1

Если вы опускаете квадратные скобки, это выражение генератора. Таким образом, вы должны ссылаться на выражения генератора. –

+0

Хороший звонок. Сделано и сделано! – jathanism

7

Это должно быть быстрее.

>>> import re 
>>> string1 = 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r' 
>>> a = ['E', 'i', 'W'] 
>>> r = re.compile('[^%s]+' % ''.join(a)) 
>>> print r.sub('', string1) 
EiiWW 

Это еще быстрее, чем это.

>>> all_else = ''.join(chr(i) for i in range(256) if chr(i) not in set(a)) 
>>> string1.translate(None, all_else) 
'EiiWW' 

44 microsec vs 13 microsec на моем ноутбуке.

Как насчет этого?

(Edit:. Оказался, перевод дает наилучшую производительность)

1

Если вы собираетесь сделать это с помощью больших строк, есть более быстрое решение с использованием translate; см. this answer.

0

@katrielalex: Для того, чтобы объяснить это:

import string 
string1= 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r' 

non_letters= ''.join(chr(i) for i in range(256) if chr(i) not in string.letters) 
print string1.translate(None,non_letters) 

print 'Simpler, but possibly less correct' 
print string1.translate(None, string.punctuation+string.digits+string.whitespace) 
Смежные вопросы