2012-06-19 1 views
1

У меня есть переменная, представляющая BMP изображение со следующей структурой:изменения суб-подсписок в кортежей в Python

image=[line1, line2, ... linen] 
line=[pix1,pix2,...,pixn] 
pix=[r,g,b] 

, таким образом, например, содержимое этой переменной может выглядеть

[[[0,0,0],[1,0,1],[2,4,5]],[[3,4,5],[1,7,4],[1,3,5]],[[2,4,2],[1,6,7],[1,9,0]]] 

сейчас Я хотел бы преобразовать пикс-списки каждой строки в кортежи, поэтому содержимое будет выглядеть примерно так:

[[(0,0,0),(1,0,1),(2,4,5)],[(3,4,5),(1,7,4),(1,3,5)],[(2,4,2),(1,6,7),(1,9,0)]] 

я мог бы сделать это

for i in range(0,len(image)-1): 
    for j in range(0,len(image[0])-1): 
     image[i][j] = tuple(image[i][j]) 

, но это не кажется, наиболее «pythonesque» способ сделать это, и мне нужен самый быстрый вычислительный метод возможно, что выше, кажется, далеко от.

Я пробовал с

[tuple(pix) for pix in line for line in image] 

, как я, хотя, это должно быть быстрее, но, конечно, выше с треском проваливается.

Так есть кто-нибудь, кто мог бы помочь мне конвертировать мои подсписки из пикс в кортежах самый быстрый способ возможно? Заранее спасибо.

+0

элегантный или короткие = быстрее. – KurzedMetal

ответ

4

Как об этом:

[map(tuple, line) for line in image] 

И Охватить комментарии для полноты. В Python 3.x, где карта генератор, вы будете использовать:

[list(map(tuple, line)) for line in image] 
+1

Я думаю, что это должно быть 'map (tuple, line)'. – phg

+0

Вы правы. Я не могу копировать/вставлять. –

+1

+1, вы также можете заметить, что на Python 3.x, 'карта()' является генератор, так что вы хотели бы 'лист (карта (...))'. –

4
[[tuple(pix) for pix in line] for line in image] 
Смежные вопросы