【问题标题】:If statement that keeps characters only仅保留字符的 if 语句
【发布时间】:2018-08-08 18:15:24
【问题描述】:

假设我们有一个列表 list_a = [a,b,C,.,/,!,d,E,f,]

我只想将字母表中的字母附加到新列表中。

所以新列表将是 list_b = [a,b,C,d,E,f]。 到目前为止,我已经尝试过这样做:

list_b = []
for elements in list_a:
    try:
        if elements == str(elements):
            list_b.append(elements)
    except ValueError: #Catches the Error when the element is not a letter
        continue

但是,当我打印 list_b 它具有 list_a 的所有元素时,它并没有完成我预期的工作。 有什么想法吗?

PS:具体例子中的逗号也会带来Error。

【问题讨论】:

  • this answer 有帮助吗?
  • 你能解释一下为什么你认为这段代码可以工作吗?我不明白你的逻辑。
  • 简单。如果列表的元素是一个字母/字符,它将被附加到一个新列表中,否则 for 循环继续。你不明白什么?
  • 我不明白为什么你会认为str('.') 不等于'.',或者什么会引发ValueError。
  • 你是对的。str(3) 不等于 '3'。虽然这适用于数字,但它不适用于逗号、问号等。对不起,我是 Pytho 的新手..

标签: python if-statement


【解决方案1】:

可以使用字符串类型的.isalpha()方法。

In [1]: list_a = ['a','b','C','.','/','!','d','E','f']

In [2]: list_b = [i for i in list_a if i.isalpha()]

In [3]: list_b
Out[3]: ['a', 'b', 'C', 'd', 'E', 'f']

【讨论】:

    【解决方案2】:

    尝试使用 .isalpha() 函数检查字符是否为字母。

    list_b = []
    for elements in list_a:
       if elements.isalpha():
            list_b.append(elements)
    

    【讨论】:

    • 对不起。对 Java 感到困惑
    【解决方案3】:

    您错过了 str() 函数不会返回您认为它返回的“str”元素的事实,只是它们的 str 表示。 尝试使用您的字典 [a-zA-Z] 创建一个列表(不是很 Python,但易于掌握)并检查您的角色是否存在于其中。 我建议从头开始编写自己的代码,而不是复制/粘贴,这是真正理解问题的唯一方法......

    【讨论】:

    • 感谢您让我知道我的错误。我会牢记这一点!
    【解决方案4】:

    你可以试试这个:

    import string
    for item in list_a:
        if item in string.ascii_letters:
            list_b.append(item)
    

    另外,查看string 模块。如果您希望使用字符串,它有很多额外的方法可以帮助您。请注意,这仅适用于 ascii 字符。如果您想检查字母表中的每个字符,那么您可以通过 isalpha() 方法,正如其他人在上面提到的那样。

    【讨论】:

      【解决方案5】:

      嗯,使用isalpha()方法的逻辑基本相同,但是你可以使用filter来做到这一点:

      list_a = ['a','b','C','.','/','!','d','E','f']
      
      list_b = list(filter(lambda i: i.isalpha(), list_a))
      
      print(list_b)
      

      输出:

      ['a', 'b', 'C', 'd', 'E', 'f']
      

      【讨论】:

        【解决方案6】:

        您可以使用stringre 包来执行此操作

        import re
        new_list = [c for c in old_list if re.match(r'[a-zA-Z]', c)]
        

        string

        import string
        new_list = [c for c in old_list if c in string.ascii_letters]
        

        【讨论】:

        • 这似乎不必要地复杂。
        • @DanielRoseman 它们是带有单个 if 测试的单行语句,我不确定它们能变得多简单。
        • 为什么要重新?对于这么小的事情。
        • 坚持KISS规则
        • 工作正常。但是 kerk12 的答案更简单、更快。无论如何谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-09
        • 1970-01-01
        相关资源
        最近更新 更多