python列表理解中的设置变量

2024-04-16 16:24:44 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我在一个生成器中为每个循环执行2到3个相同的计算,有没有办法将它们设置为变量?在

一个简单的例子如下:

#Normal
[len( i ) for i in list if len( i ) > 1]

#Set variable
[x for i in list if x > 1; x = len( i )]

在有人说len( i )会如此之快之前,差异可以忽略不计,我也指对于其他计算,使用len只是让它更容易阅读。 另外,如果有办法,你会如何设置多个变量?在

如果以前有人问过我,我很抱歉,但是我到处找了找,没有找到任何东西。在


Tags: inforlenif差异variablelist例子
3条回答

正如您正确推测的那样,大多数Python实现并没有通用的子表达式优化,因此您的第一个表达式确实会在每次迭代中调用len(x)两次。所以为什么不只有两种理解:

a = [len(x) for x in list]
b = [x for x in a if x > 1]

它进行两次传递,但每次只调用len()一次。如果这个功能很贵的话,那可能是个胜利。我得给这件事计时才能确定。在

赛博的嵌套版本本质上是一样的。在

在python2中使用itertools.imap将是完成所需操作的有效方法,而且很可能比生成器表达式表现得更好:

[x for x in  imap(len, lst) if x > 4]

绕过这个昂贵操作的一种方法是将生成器嵌套在一个列表理解中,例如,它只是一个过滤器

def foo(x):       # assume this function is expensive
    return 2*x

>>> [j for j in (foo(i) for i in range(6)) if j > 4]
#                ^ only called once per element
[6, 8, 10]

在你的例子中使用类似的函数和变量,你可以

^{pr2}$

相关问题 更多 >