我想编写一个函数来过滤掉所有不是字母的字符。 例如,
allLetters(" Hell4208o@World.com") - > “HelloWorldcom”
我知道如何使用内置函数执行此操作,例如isalpha
,.join
,.append
。
def allLetters2(phrase):
l = []
for characters in phrase:
if characters.isalpha():
l.append(characters)
return ''.join(l)
但我正在寻找一种方法,我不会使用这些功能,只使用for
循环和string.ascii_letters
。与此结构类似:
def allLetters2(phrase):
for characters in phrase:
if characters == string.ascii_letters:
return characters
答案 0 :(得分:5)
您可以使用:
''.join(char for char in pharse if char in string.ascii_letters)
当您执行for characters in phrase
个字符实际上是该短语中的一个字符。循环逐个遍历它们。 string.ascii_letters
是一个包含所有字母的字符串 - 短语中的单个字符将永远不会相等。这使您的支票 - characters == string.ascii_letters
不合逻辑。
您应该检查该字符是否为in
string.ascii_letters。这告诉我们它是否是一封ascii字母。
In [51]: 'a' in 'abcd'
Out[51]: True
您的代码也有错误的退货声明。即使条件为真,它也只返回一个字符。您的代码可以重建为:
def allLetters2(phrase):
okchars = []
for character in phrase:
if character in string.ascii_letters:
okchars.append(character)
return ''.join(okchars)
这正是我上面的代码所做的 - 只是它使用list comprehension来缩短和提高可读性。
答案 1 :(得分:1)
如果你不想使用连接只是连接:
import string
def all_letters(s):
final = ""
for char in s:
if char in string.ascii_letters:
final += char
return final
In [78]: all_letters("Hell4208o@World.com")
Out[78]: 'HelloWorldcom'
不同方法的一些时间安排:
In [90]: %%timeit
final = ""
for char in s:
if char in string.ascii_letters:
final += char
....:
100000 loops, best of 3: 3.97 µs per loop
In [91]: timeit ''.join(char for char in s if char in string.ascii_letters)
100000 loops, best of 3: 4.62 µs per loop
In [92]: timeit ''.join([char for char in s if char in string.ascii_letters])
100000 loops, best of 3: 3.8 µs per loop
In [98]: timeit "".join([x for x in s if x.isalpha()])
100000 loops, best of 3: 3.01 µs per loop
In [102]: timeit s.translate(None, ''.join(set(s)-set(ascii_letters)))
100000 loops, best of 3: 5.13 µs per loop
答案 2 :(得分:0)
一般来说,过滤/删除或选择字符集子集等问题最好由str.translate处理,如果使用得当,
<强>码强>
def allLetters(st):
from string import ascii_letters
return st.translate(None, ''.join(set(st)-set(ascii_letters)))
<强>使用强>
>>> allLetters("Hell4208o@World.com")
'HelloWorldcom'