我有这个嵌套列表:
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]]
我认为通过切片列表,它不会影响其他元素。但是在这种情况下它没有用。有人可以向我解释一下吗?
答案 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]]