python - 如何在列表理解中有多个条件子句?
问题描述
我正在做一些字符串解析,如果字符是字母,则返回 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
如果字符不是字母数字,我希望它不添加任何内容。我的代码有什么问题?
我将不得不执行这个函数可能数十亿次,所以如果有更好的方法来做到这一点,任何提高效率的方法都是受欢迎的。
解决方案
如果您根本不想考虑特定元素,则应在理解的末尾包含该条件作为警卫。
[1 if char.isalpha() else 2 for char in string if char.isdigit() or char.isalpha()]
最后if char.isdigit() or char.isalpha()
的 消除了任何不满足这些谓词的元素。
话虽如此,为了便于阅读,我建议至少将翻译部分(可能还有条件)分解为一个单独的函数。这个单行,虽然看起来很聪明,但它的可读性并不高。
推荐阅读
- ansible - Ansible 执行剧本 boto 丢失
- c# - C# Docker MongoDB 30000 毫秒后超时
- json - 确定Oracle表中最大#json数组元素
- django - 使用 Django Import-Export 导入文件时如何访问行值?
- javascript - Python - selenium - AngularJS 下拉菜单,如何点击它们?
- r - ggplot2 字幕壮举中的自定义颜色。蜡笔和胶水
- excel - 删除已排序的行
- machine-learning - 如何改进我的文本主题分类器?
- c++ - 为什么执行矩阵乘法的两个进程并行运行比连续运行慢?
- maven - `mvn clean package` 正在执行我的项目 main