在Python中构建列表时忽略一个元素。

21
我需要使用Python中的[f(char) for char in string]语法从字符串构建列表,并且我希望能够忽略(不将其插入到列表中)等于None的f(x)值。如何实现?
2个回答

40
我们可以创建一个“子查询”。
[r for r in (f(char) for char in string) if r is not None]

如果你也允许所有False值(0、False、None等)被忽略,那么可以使用filter

filter(None, (f(char) for char in string) )
# or, using itertools.imap,
filter(None, imap(f, string))

1
我喜欢第一个,谢谢!只需构建一个可迭代对象作为中间件非常干净。我之前一直在用两行代码或者[f(x) for x in l if f(x) is not None],这样会不必要地执行两次操作。 - Luke Davis
@luke-davis,如果你使用所谓的记忆化技术,就不会有这个问题了。但这仍然不够优雅。 - Christoforus Surjoputro

0

你可以在for循环中添加一个条件语句,检查每个元素是否不为None或空

[element for element in list_of_elements) if element]

这样可以避免双重循环

例如,从列表中删除偶数:

f = lambda x: x % 2
list_of_elements = [1, 2, 3, 4, 5, 7, 34, 45, 55, 65, 66]
c = [element for element in list_of_elements if f(element)]

输出:

[1, 3, 5, 7, 45, 55, 65]

这并不是这个问题的真正意思。我的目的是在应用转换函数“f”后,基于转换结果从列表中删除元素,但不需要对每个元素调用两次转换函数“f”。你提供的解决方案不能解答这个问题, 也不符合语法规范。 - Mat
由于这里全部使用迭代器,所以在被接受的答案中没有涉及“双重循环”。 - Mat
上述答案中有两个嵌套的for循环。我添加了一个例子。 - Crandel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接