只有字母起作用

2024-10-03 00:17:17 发布

您现在位置: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。与此结构类似:

^{pr2}$

Tags: 函数comforworld字母字符内置join
3条回答

一般来说,过滤/删除或选择字符集子集之类的问题最好由str.translate处理,如果使用的是正确的话

编码

def allLetters(st):
    from string import ascii_letters
    return st.translate(None, ''.join(set(st)-set(ascii_letters)))

用法

^{pr2}$

您可以使用:

''.join(char for char in pharse if char in string.ascii_letters)

当您这样做时,for characters in phrase字符实际上是短语中的一个字符。循环一个接一个地绕着他们。string.ascii_letters是一个包含所有字母的字符串-短语中的单个字符永远不等于这个值。这使您的检查-characters == string.ascii_letters不合逻辑。在

相反,您应该检查字符是否是in字符串.ascii_字母. 这告诉我们它是否是一个ascii字母。在

^{pr2}$

您的代码还有一个放错位置的return语句。即使条件为真,它也只返回一个字符。您的代码可以重建为:

def allLetters2(phrase):   
   okchars = [] 
   for character in phrase:
      if character in string.ascii_letters:            
         okchars.append(character)
   return ''.join(okchars)

这正是我上面的代码所做的-只是它使用list comprehension使其更简短、更具可读性。在

如果不想使用join,只需连接:

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'

不同方法的一些时间安排:

^{pr2}$

相关问题 更多 >