如何在python中的列表列表的所有元素上执行"一行"赋值

rwo*_*lst 4 python list

给出一个列表列表lol,我想在一行中做

for ele in lol:
    ele[1] = -2
Run Code Online (Sandbox Code Playgroud)

我试过了

lol = map(lambda x: x[1] = -2, lol)
Run Code Online (Sandbox Code Playgroud)

但它不可能在lambda函数中执行赋值.

zon*_*ndo 7

您可以使用以下setitem()功能operator:

from operator import setitem

lol = [setitem(x, 1, -2) or x for x in lol]
Run Code Online (Sandbox Code Playgroud)

您还可以取出lol重新定义,然后执行此操作:

from operator import setitem

map(lambda x: setitem(x, 1, -2), lol)
Run Code Online (Sandbox Code Playgroud)

要么

from operator import setitem

[setitem(x, 1, -2) for x in lol]
Run Code Online (Sandbox Code Playgroud)

我必须同意Padraic,但你的方法看起来很好.


Pad*_*ham 7

我不会改变你自己的方法,而是回答你的问题:

lol = [[1,3],[3,4]]
from operator import setitem

map(lambda x: setitem(x, 1, -2), lol)
print(lol)
[[1, -2], [3, -2]]
Run Code Online (Sandbox Code Playgroud)

它完成了任务,但你基本上使用map副作用并创建None的列表:

In [1]: lol = [[1, 3], [3, 4]]


In [2]: from operator import setitem

In [3]: map(lambda x: setitem(x, 1, -2), lol)
Out[3]: [None, None]

In [4]: lol
Out[4]: [[1, -2], [3, -2]]
Run Code Online (Sandbox Code Playgroud)

所以真的坚持自己的循环逻辑.

它们简单的循环也更高效:

In [13]: %%timeit                                          
lol = [[1,2,3,4,5,6,7,8] for _ in range(100000)]
map(lambda x: setitem(x, 1, -2), lol)
   ....: 

10 loops, best of 3: 45.4 ms per loop

In [14]: 

In [14]: %%timeit                                          
lol = [[1,2,3,4,5,6,7,8] for _ in range(100000)]
for sub in lol:
    sub[1] = -2
   ....: 
10 loops, best of 3: 31.7 ms per 
Run Code Online (Sandbox Code Playgroud)

唯一的时间图.如果你可以使用内置函数或方法调用它们,那么真的很好.即map(str.strip, iterable),一旦你包含一个lambda,性能通常会受到重创.