可能重复:
What is the most “pythonic” way to iterate over a list in chunks?
我正在阅读一些PNG数据,每个像素有4个通道。我想一次迭代数据1个像素(意味着每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个项目解压缩?
答案 0 :(得分:33)
(Python的itertools应该真正使all recipes成为标准函数...)
您可以使用grouper
功能:
from itertools import izip_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
,因此额外的字节将填充为None 。
答案 1 :(得分:22)
vars = [1, 2, 3, 4, 5, 6, 7, 8]
for a, b, c, d in zip(*[iter(vars)]*4):
print a, b, c, d
答案 2 :(得分:6)
from itertools import izip
for r,g,b,a in izip(*[iter(data)]*4):
...
答案 3 :(得分:3)
for r, g, b, t in (data[i:i+4] for i in xrange(0, len(data)/4*4, 4)):
print r, g, b, t
答案 4 :(得分:-2)
尝试这样的事情:
for red, green, blue, alpha in raw_png_data:
#do something
您可以提取多个项目,而不必使用迭代器。 :)
编辑:这意味着raw_png_data需要是4个值元组的列表。将每个rgba组放入元组然后将其附加到raw_png_data并像我的示例一样迭代将是最pythonic。