2013-09-27 59 views
3

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

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)]] 

回答

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] 
+0

的这个常识的定义是什么,如果我想补充两个功能,在嵌套列表理解中set_bit(像素值,位,0)和char_to_bits(消息)。 –

+0

用for循环可以做到这一点吗? –

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到一个数组