首页 > 解决方案 > 如何在列表理解中有多个条件子句?

问题描述

我正在做一些字符串解析,如果字符是字母,则返回 1,如果字符是数字,则返回 2,如果字符是其他字符,则通过。

通常我只会使用 for 循环并像这样附加到它

string = 'hello123...'
values = []
for char in string:
    if char.isalpha():
        values.append(1)
    elif char.isdigit():
        values.append(2)

返回

[1, 1, 1, 1, 1, 2, 2, 2]

正如预期的那样。根据https://stackoverflow.com/a/30245465/10029403,使用列表推导可以更快。所以我尝试了:

values = [1 if char.isalpha else 2 if char.isdigit for char in string]

但是,这给了我一个语法错误,因为预期会出现“else”。

File "C:/Users/test3.py", line 12
values = [1 if char.isalpha else 2 if char.isdigit for char in string]
                                                     ^
SyntaxError: invalid syntax

如果字符不是字母数字,我希望它不添加任何内容。我的代码有什么问题?

我将不得不执行这个函数可能数十亿次,所以如果有更好的方法来做到这一点,任何提高效率的方法都是受欢迎的。

标签: pythonlistif-statementlist-comprehension

解决方案


如果您根本不想考虑特定元素,则应在理解的末尾包含该条件作为警卫

[1 if char.isalpha() else 2 for char in string if char.isdigit() or char.isalpha()]

最后if char.isdigit() or char.isalpha()的 消除了任何不满足这些谓词的元素。

话虽如此,为了便于阅读,我建议至少将翻译部分(可能还有条件)分解为一个单独的函数。这个单行,虽然看起来很聪明,但它的可读性并不高。


推荐阅读