2013-09-27 64 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到一個數組