如何迭代一片嵌套列表?

时间:2017-12-09 01:05:02

标签: python python-3.x

我有这个嵌套列表:

nested = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

我想从内部列表的前2个元素中减去1,所以我尝试了列表理解:

nested = [[x - 1 for x in stack[0:2]] for stack in nested]

它确实给了我内部列表减去1的前2个元素,但它完全删除了最后一个元素

nested = [[0, 0], [1, 1], [2, 2]]

我认为通过切片列表,它不会影响其他元素。但是在这种情况下它没有用。有人可以向我解释一下吗?

4 个答案:

答案 0 :(得分:3)

要保留第3个元素,请将其包含在列表解析中:

>>> [ [x - 1 for x in stack[0:2]] + stack[2:] for stack in nested ]
[[0, 0, 1], [1, 1, 2], [2, 2, 3]]

以上适用于任何长度的stack

或者,如果stack总是有三个元素:

>>> [[x-1, y-1, z] for x, y, z in nested]
[[0, 0, 1], [1, 1, 2], [2, 2, 3]]

或者,您可以进行更改:

>>> for stack in nested: stack[0]-=1; stack[1]-=1
... 
>>> nested
[[0, 0, 1], [1, 1, 2], [2, 2, 3]]

答案 1 :(得分:1)

另一个选择是使用numpy自然地进行这种切片

import numpy as np
nested = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])

nested[:,:2] -= 1

返回

array([[0, 0, 1],
       [1, 1, 2],
       [2, 2, 3]])

答案 2 :(得分:0)

试试这样:

nested = [[x - 1  if i < 2 else x for i,x in enumerate(stack)] for stack in nested]

这只会影响前两个元素,其余部分保持不变。

答案 3 :(得分:0)

您可以使用enumerate

nested = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
new_nested = [[a-1 if i == 0 or i == 1 else a for i, a in enumerate(b)] for b in nested]

输出:

[[0, 0, 1], [1, 1, 2], [2, 2, 3]]

编辑:替代方案,map

nested = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
new_nested = [map(lambda x:x-1, i[:2])+[i[-1]] for i in nested]

输出:

[[0, 0, 1], [1, 1, 2], [2, 2, 3]]