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

时间:2016-03-29 11:17:09

标签: python list

给出列表lol列表,我想一行

for ele in lol:
    ele[1] = -2

我试过

lol = map(lambda x: x[1] = -2, lol)

但它无法在lambda函数中执行赋值。

4 个答案:

答案 0 :(得分:7)

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

from operator import setitem

lol = [setitem(x, 1, -2) or x for x in lol]

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

from operator import setitem

map(lambda x: setitem(x, 1, -2), lol)

from operator import setitem

[setitem(x, 1, -2) for x in lol]

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

答案 1 :(得分:7)

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

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

map(lambda x: setitem(x, 1, -2), lol)
print(lol)
[[1, -2], [3, -2]]

它完成了任务,但你基本上是使用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]]

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

他们简单的循环也是更高效的:

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 

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

答案 2 :(得分:1)

你试过了吗?

>>> lol = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> lol =[[-2] + mas for x, *mas in lol]
>>> lol
[[-2, 2, 3], [-2, 5, 6], [-2, 8, 9]]
>>> 

答案 3 :(得分:1)

这个答案不是最有效的方式,我只是发布它以获得有关它质量的反馈,如果它是Pythonic的方式,否则我将删除它,如果它#&## 39; s downvoted,所以:

>>> lol
[[1, 3], [3, 4]]
>>> 
>>> 
>>> list(map(lambda x:x.__setitem__(1, -2), lol)) #list required in Python 3
[None, None]
>>> lol
[[1, -2], [3, -2]]