更改列表中元组的值

时间:2013-09-27 03:01:19

标签: python list tuples

我有一个包含三元素元组的二维列表。

image = [[(15, 103, 255), (0, 3, 19)],[(22, 200, 1), (8, 8, 8)],[(0, 0, 0), (5, 123, 19)]]

我想为每个元素添加一个。

def get_elements(image):
    for i in range(len(image)-1) :
        m = image[i]
        for j in range(len(m)-1) :
            n = image[j]
            for k in range(len(n)-1) :
                ans = image[i][j][k]
                ans = ans+1
                return ans

这段代码只是在第一个元素中添加一个并返回15 + 1 = 16.我希望它给出:

image = [[(16, 104, 256), (1, 4, 20)],[(23, 201, 2), (9, 9, 9)],[(1, 1, 1), (6, 124, 20)]]

2 个答案:

答案 0 :(得分:10)

元组是不可变的。您无法直接修改它们,因此最好的办法是生成一个包含新元组的新列表。

>>> image
[[(15, 103, 255), (0, 3, 19)], [(22, 200, 1), (8, 8, 8)], [(0, 0, 0), (5, 123, 19)]]
>>> [[(r+1,g+1,b+1) for r,g,b in row] for row in image]
[[(16, 104, 256), (1, 4, 20)], [(23, 201, 2), (9, 9, 9)], [(1, 1, 1), (6, 124, 20)]]

这使用两个嵌套列表推导。外部循环遍历每一行,每次迭代产生一个新的替换行(此处表示为[...]):

[[...] for row in image]

内部循环遍历每行中的像素,产生具有修改的RGB值的新元组。

[(r+1,g+1,b+1) for r,g,b in row]

答案 1 :(得分:4)

如果您正在进行图像处理,则应考虑numpy

>>> import numpy as np
>>> image = np.array([[(15, 103, 255), (0, 3, 19)],[(22, 200, 1), (8, 8, 8)],[(0, 0, 0), (5, 123, 19)]])
>>> image + 1
array([[[ 16, 104, 256],
        [  1,   4,  20]],

       [[ 23, 201,   2],
        [  9,   9,   9]],

       [[  1,   1,   1],
        [  6, 124,  20]]])

numpy已经有了将1添加到数组

的常识定义