Python 3.x 如何在条件列表理解中使用函数调用结果?
我想将此代码转换为一个列表:Python 3.x 如何在条件列表理解中使用函数调用结果?,python-3.x,list-comprehension,Python 3.x,List Comprehension,我想将此代码转换为一个列表: l = list() for i in range(10): j = fun(i) if j: l.append(j) 这意味着我只想将truthyfun()结果值添加到列表中。如果没有对该函数调用的真实检查,列表理解将是: l = [fun(i) for i in range(10)] 在列表理解中添加一个if-fun(i)将导致每次迭代对fun()进行两次评估(实际上,似乎并不总是如此!),因此,如果fun()不是纯粹的,则会
l = list()
for i in range(10):
j = fun(i)
if j:
l.append(j)
这意味着我只想将truthyfun()
结果值添加到列表中。如果没有对该函数调用的真实检查,列表理解将是:
l = [fun(i) for i in range(10)]
在列表理解中添加一个if-fun(i)
将导致每次迭代对fun()
进行两次评估(实际上,似乎并不总是如此!),因此,如果fun()
不是纯粹的,则会导致意外的副作用
我是否可以捕获
fun(I)
的结果,并在相同的理解中使用它,如果j,则本质上添加?(相关问题)您可以在列表comp中创建一个内部生成器,以便查看func的结果
l = [j for j in (func(i) for i in range(10)) if j]
或者结合两种建议的解决方案:
filter(None, (func(i) for i in range(10)))
编辑
简单得多:
[res for res in map(func, range(10)) if res]
谢谢你给福斯特的提示
旧答案
另一个选项是使用辅助生成器函数:
def call_iter(func, iterable):
for arg in iterable:
yield func(arg)
[res for res in call_iter(func, range(10)) if res]
l=filter(None,map(fun,range(10))
或l=[x代表x in(fun(i)代表i代表范围(10)),如果x]
@falsetru:您的第一条语句返回一个iterablefilter
对象而不是列表,而您的第二条语句是一个习惯用法和一个实际列表。是的,您需要将第一条语句用列表(…)
获取列表。@falsetru:这将导致总共两次迭代,除非全部迭代,并且延迟操作(根据需要)。map
,filter
在Python 3.x中延迟操作(返回迭代器)。这将返回一个过滤器对象
iterable,而不是列表本身。但在大多数情况下,这可能无关紧要。这是一个问题,但与返回iterablefilter
对象的习惯用法不同,l
是请求的列表。虽然这会起作用,但它与我对一行程序的痴迷相矛盾,并努力实现最大的代码密度;-)嗯,你可以重复使用这个功能。因此,将它放入一个模块tools
,只需一次导入即可获得一行程序。您不需要调用iter
。你可以重用map
@falsetru,这很明显。有时事情太简单,无法识别它们。固定的。