我正在读取一些PNG数据,它每像素有4个通道。我想一次迭代数据一个像素(这意味着每4个元素=1个像素,rgba)。
red_channel = 0
while red_channel < len(raw_png_data):
green_channel, blue_channel, alpha_channel = red_channel +1, red_channel +2, red_channel +3
# do something with my 4 channels of pixel data ... raw_png_data[red_channel] etc
red_channel += 4这种方式并不是真正的“正确”。是否有更多的Pythonic方法来迭代一个序列,一次迭代4个项,并将这4个项解压?
发布于 2010-08-05 13:32:35
(Python的迭代工具确实应该将所有菜谱作为标准函数.)
您可以使用grouper函数:
from itertools import zip_longest
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)然后,您可以迭代像素
for r,g,b,a in grouper(4, raw_png_data):
....或者,你可以用
irpd = iter(raw_png_data)
for r,g,b,a in zip(irpd, irpd, irpd, irpd): # use itertools.izip in Python 2.x
....注意,如果可迭代的长度不是4的倍数,这将分割最后几个字节。OTOH,grouper函数使用izip_longest,因此额外的字节将不会被填充。
发布于 2010-08-05 13:31:40
vars = [1, 2, 3, 4, 5, 6, 7, 8]
for a, b, c, d in zip(*[iter(vars)]*4):
print a, b, c, d发布于 2010-08-05 13:32:37
from itertools import izip
for r,g,b,a in izip(*[iter(data)]*4):
...https://stackoverflow.com/questions/3415072
复制相似问题