python:仅当它在此列表中时才保留char

l--*_*''' 1 python string list

我有一个清单:

a = ['a','b','c'.........'A','B','C'.........'Z']
Run Code Online (Sandbox Code Playgroud)

我有字符串:

string1= 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r'
Run Code Online (Sandbox Code Playgroud)

我想只保留那些string1存在的角色a

这样做最有效的方法是什么?或许不是a一个列表,我应该只是使它成为一个字符串?像这样a='abcdefg..........ABC..Z'

OTZ*_*OTZ 7

这应该更快.

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

这甚至比这更快.

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

我的笔记本电脑上有44微秒对13微秒.

那个怎么样?

(编辑:结果,翻译产生最佳表现.)


Ofr*_*viv 5

''.join([s for s in string1 if s in a])
Run Code Online (Sandbox Code Playgroud)

说明:

[s for s in string1 if s in a]
Run Code Online (Sandbox Code Playgroud)

在string1中创建所有字符的列表,但前提是它们也在列表a中.

''.join([...])
Run Code Online (Sandbox Code Playgroud)

通过将其与给定列表的元素之间的任何内容('')连接,将其转换回字符串.

  • @I__你应该知道,如果`a`足够大,这会变得非常慢.你应该把它作为一套,或者去我所提出的`re`方法.如果`a`很大,`re`方法通常是最快的. (3认同)