首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迭代序列的Pythonic方法,一次迭代4个项

迭代序列的Pythonic方法,一次迭代4个项
EN

Stack Overflow用户
提问于 2010-08-05 13:25:56
回答 5查看 35.2K关注 0票数 38

可能重复: 什么是最“pythonic”的方式来迭代一个列表的块?

我正在读取一些PNG数据,它每像素有4个通道。我想一次迭代数据一个像素(这意味着每4个元素=1个像素,rgba)。

代码语言:javascript
运行
复制
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个项解压?

EN

回答 5

Stack Overflow用户

发布于 2010-08-05 13:32:35

(Python的迭代工具确实应该将所有菜谱作为标准函数.)

您可以使用grouper函数:

代码语言:javascript
运行
复制
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)

然后,您可以迭代像素

代码语言:javascript
运行
复制
for r,g,b,a in grouper(4, raw_png_data):
  ....

或者,你可以用

代码语言:javascript
运行
复制
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,因此额外的字节将不会被填充。

票数 38
EN

Stack Overflow用户

发布于 2010-08-05 13:31:40

代码语言:javascript
运行
复制
vars = [1, 2, 3, 4, 5, 6, 7, 8]
for a, b, c, d in zip(*[iter(vars)]*4):
    print a, b, c, d
票数 34
EN

Stack Overflow用户

发布于 2010-08-05 13:32:37

代码语言:javascript
运行
复制
from itertools import izip
for r,g,b,a in izip(*[iter(data)]*4):
    ...
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3415072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档