Python 循环的Lambda范围

Python 循环的Lambda范围,python,python-2.7,for-loop,lambda,Python,Python 2.7,For Loop,Lambda,注意:我不确定我应该在这里还是在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更改列表。我的代码是: print(lambda w,x=10,y=ran

注意:我不确定我应该在这里还是在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更改列表。我的代码是:

print(lambda w,x=10,y=range(10): (map(lambda g: (lambda f=y.__setitem__: (f(g,0) )()), range(w*w,x,w)), y))(2)

"""
w is the step value in the for loop, which is 2
x is the size of the list, 10
y is the list, range(10)

lambda g is the first argument for map as the function. It sets the value of the list y at the current index g to be 0, through the use of lambda f's setitem
range(w*w,x,w) is the second argument passed to map as an iterable. In theory, all the indexes of y in this list should be set to 0 through the use of lambda f

y is returned to be printed
2 is the value passed to w
"""

但是,这会返回错误的
[0,1,2,3,4,5,6,7,8,9]
。有人知道我如何在一条线上做到这一点吗?我是否应该使用其他内置组件在lambda中创建循环?我使用和作为参考,以防有帮助。

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

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)
更正:

上述代码仅在
范围(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或1)和b
在计算
a
的值后总是计算为
b

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

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)
更正:

上述代码仅在
范围(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或1)和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]
一种不那么令人讨厌的方法是使用切片分配

>>> y = range(10)
>>> y[w*w: x: w] = [0]*len(range(w*w, x, w))
>>> y
[0, 1, 2, 3, 0, 5, 0, 7, 0, 9]

使用
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]
一种不那么令人讨厌的方法是使用切片分配

>>> y = range(10)
>>> y[w*w: x: w] = [0]*len(range(w*w, x, w))
>>> y
[0, 1, 2, 3, 0, 5, 0, 7, 0, 9]

下面是一个纯
lambda
实现,它将
w
x
y
作为顶级
lambda
的参数:

>>> (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]
>>> 

请注意,这避免了使用
\uuu setitem\uuu
这里是一个纯
lambda
实现,它将
w
x
y
作为顶级
lambda
的参数:

>>> (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]
>>> 

请注意,这样可以避免使用
\uuuuu setitem\uuuuu

,目的是使其成为一行吗?或者使用lambdas消除所有for循环类型构造?可以使用列表理解吗?它应该是一个单行的基本筛。这只是其中的一部分,你不应该这样做。这是非常糟糕的代码。目标是使其成为一行吗?或者使用lambdas消除所有for循环类型构造?可以使用列表理解吗?它应该是一个单行的基本筛。这只是其中的一部分,你不应该这样做。这是非常糟糕的代码。在您的第一个示例中,如何通过打印lambda来返回y?您的意思是像
print(lambda:(map(lambda I:y.u setitem_uuu(I,0),range(w*w,x,w)),y)[1])一样
?您可以使用这样的副作用进行打印
print(map(lambda I:y.u setitem_u(I,0),range(w*w,x,w)),y)[1]
在您的第一个示例中,如何通过打印lambda得到y?您的意思是像
打印(lambda:(map(lambda I:y.u setitem_uuu(I,0),range(w*w,x,w)),y)[1])()
您可以像这样打印(map(lambda I:y.u setitem_u(I,0),range(w*w,x,w)),y)[1]
通常
(expression1和expression2)
在Python中,如果
expression1
是真实的(例如非零数字、非空列表等),则计算为
expression2
,如果
expression1
是虚假的(0、[]等)。通常
(expression1和expression2)
在Python中,如果
expression1
是真的(例如非零数字、非空列表等),并且
expression1
如果
expression1
是假的(0、[]等),则计算结果为
expression2