Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 避免在列表理解中计算同一表达式两次_Python_Python 3.x_List Comprehension - Fatal编程技术网

Python 避免在列表理解中计算同一表达式两次

Python 避免在列表理解中计算同一表达式两次,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,我正在列表理解中使用函数和if函数: new_list = [f(x) for x in old_list if f(x) !=0] 在每个循环中计算两次表达式fx,这让我很恼火 有没有更干净的方法?在列表理解的开始部分存储值或包含if语句。预先计算结果并对其进行迭代 new_list = [x for x in map(f, old_list) if x !=0] 此外,由于map在访问元素时计算每个元素的结果,因此这只是一个循环。预先计算结果并对其进行迭代 new_list = [x f

我正在列表理解中使用函数和if函数:

new_list = [f(x) for x in old_list if f(x) !=0]
在每个循环中计算两次表达式fx,这让我很恼火


有没有更干净的方法?在列表理解的开始部分存储值或包含if语句。预先计算结果并对其进行迭代

new_list = [x for x in map(f, old_list) if x !=0]

此外,由于map在访问元素时计算每个元素的结果,因此这只是一个循环。

预先计算结果并对其进行迭代

new_list = [x for x in map(f, old_list) if x !=0]

此外,由于map在访问元素时计算每个元素的结果,因此这只是一个循环。

在Python3.8中,我们将拥有并能够做到这一点

[如果y:=fx!=0,则y代表旧_列表中的x]
在Python3.8中,我们将拥有并能够做到这一点

[如果y:=fx!=0,则y代表旧_列表中的x] 您可以使用筛选器删除结果:

def f x: 返回x*2 旧列表=[0,1,2,3] 新列表=过滤器lambda x:x!=0,[fx代表旧列表中的x] 对于新列表中的x: printx 看到它工作了吗

或者,您可以记忆该函数,以避免必须计算相同的结果两次:

def f x: 返回x*2 def备忘录EF: 备忘录={} def helperx: 如果备忘录中没有x: 打印%s%x的计算结果 备忘录[x]=fx 返回备忘录[x] 返回助手 memF=memoizef 旧列表=[0,1,2,3] 新_列表=[如果memFx!=0,则旧_列表中x的memFx] 对于新列表中的x: printx 可用的

您可以使用筛选器删除结果:

def f x: 返回x*2 旧列表=[0,1,2,3] 新列表=过滤器lambda x:x!=0,[fx代表旧列表中的x] 对于新列表中的x: printx 看到它工作了吗

或者,您可以记忆该函数,以避免必须计算相同的结果两次:

def f x: 返回x*2 def备忘录EF: 备忘录={} def helperx: 如果备忘录中没有x: 打印%s%x的计算结果 备忘录[x]=fx 返回备忘录[x] 返回助手 memF=memoizef 旧列表=[0,1,2,3] 新_列表=[如果memFx!=0,则旧_列表中x的memFx] 对于新列表中的x: printx
可用的

您可以使用生成器表达式,以避免在列表中创建不必要的列表:

new_list = [fx for fx in (f(x) for x in old_list) if fx != 0]
从python 3.8开始,您将能够:


可以使用生成器表达式,以避免在列表中创建不必要的列表:

new_list = [fx for fx in (f(x) for x in old_list) if fx != 0]
从python 3.8开始,您将能够:


可能使用just for loop?new_list=[computed for computed in[fx for x in old_list]if computed!=0]-将所有内容作为内部列表列出,然后在外部理解中过滤以添加到上面的注释中-将内部放在圆括号中以使生成器延迟计算,而不是存储整个内部列表。从python 3.8开始,您可以使用walrus运算符。新列表=[y代表旧列表中的x如果y:=fx]请参阅可能仅用于循环?新列表=[computed for computed in[fx for x in old\U list]如果计算!=0]-将所有内容作为内部列表列出,然后在外部理解中过滤以添加到上面的注释中-将内部放在括号中以使生成器惰性地进行计算,而不是存储整个内部列表。从python 3.8开始,您可以使用walrus运算符。new_list=[y代表旧_list中的x,如果y:=fx]看,混合列表理解和映射不是最好的主意。@OlvinRoght你能详细说明一下吗?处理列表和其他可编辑数据有两种方法:1列表理解;2映射、过滤和减少。选择你的立场。当你把它们混合到一个表达式中时,会有点混乱。所以它应该是new_list=listfilterlambda x:x!=0、mapf、旧列表或新列表=[x代表旧列表中的项目,如果x!=0]。@OlvinRoght为什么需要在这方面“选择一方”?这两个概念混合得很好!或者你有反例吗?或者这对你来说是一个风格的问题,我几乎可以同意…?@HiroProgator,是的,更多的是关于风格。map是函数式编程方法的一部分。将列表理解和map结合起来不是最好的方法。@OlvinRoght您能详细说明一下吗?有两种方法可以处理列表和其他可编辑数据:1列表理解;2映射、过滤和减少。选择你的立场。当你把它们混合到一个表达式中时,会有点混乱。所以它应该是new_list=listfilterlambda x:x!=0、mapf、旧列表或新列表=[x代表旧列表中的项目,如果x!=0]。@OlvinRoght为什么需要在这方面“选择一方”?这两个概念混合得很好!或者你有反例吗?或者这对你来说是一个风格的问题,我几乎可以同意…?@HiroProgator,是的,更多的是关于风格。“映射是函数式编程方法的一部分。”gerrit指出,并添加了example@gerrit注意,添加了一个示例