循环的Lambda范围

2024-05-14 18:41:40 发布

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

注意:我不确定我是应该在这里还是在CodeGolf上问这个问题,所以我会把它贴在这里,以备不时之需。在

我尝试使用以下格式的lambdas在python中创建一个for循环:

x = 10
y = range(10)
w = 2

for g in range(w*w, x, w):
    y[g] = 0

print y

这将输出正确的列表[0, 1, 2, 3, 0, 5, 0, 7, 0, 9]。但是,我无法使用lambdas更改列表。我的代码是:

^{pr2}$

但是,这将返回[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],这是错误的。有人知道我怎样才能做到这一点吗?我应该使用其他内置函数来生成lambda中的循环吗?我使用了this和{a2}作为参考,以防有帮助。在


Tags: lambda函数代码in列表for格式错误
3条回答

下面是一个纯粹的lambda实现,它将wx和{}作为顶层{}的参数:

>>> (lambda w,x,y: (lambda s: map(lambda v: 0 if v in s else v, y))(set(range(w*w,x,w))))(2,10,range(10))
[0, 1, 2, 3, 0, 5, 0, 7, 0, 9]
>>> 

请注意,这样可以避免使用__setitem__。在

可能更容易使用列表理解:

print (lambda w, x=10, y=range(10):\
       [(0 if (i >= w*w and i < x and i%w==0) else n) for i, n in enumerate(y)])(2)

为了可读性,移到了两行,但您可以删除\和换行符,它将正常运行。在

一个警告是,这不会更改原始列表,而是返回一个新列表。在

如果您需要它来更新原始列表并返回它,可以使用短路:

^{pr2}$

更正:

上面的代码只有在range(w*w, x, w)非空的情况下才有效,即w*w > x,这是一个弱条件。在

以下更正了此问题:

print (lambda w, x=10, y=range(10):\
       (([y.__setitem__(i, 0) for i in range(w*w, x, w)] or 1) and y))(2)

这使用了这样一个事实,即(a or 1) and b在计算a的值之后,总是计算b。在

使用map作为副作用是令人讨厌的,但是:

>>> x = 10
>>> y = range(10)
>>> w = 2
>>> map(lambda i: y.__setitem__(i, 0), range(w*w, x, w))
[None, None, None]
>>> y
[0, 1, 2, 3, 0, 5, 0, 7, 0, 9]

一种不那么令人反感的方法是使用切片分配

^{pr2}$

相关问题 更多 >

    热门问题