只有字母功能

时间:2014-09-12 20:17:10

标签: python

我想编写一个函数来过滤掉所有不是字母的字符。 例如,

  

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

3 个答案:

答案 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'