>>> n = 3
>>> x = range(n ** 2),
>>> xn = list(zip(*[iter(x)] * n))

PEP 618中,作者给出了一个如何使用zip将数据分成相等大小的组的例子.

它怎麽工作?

我认为它依赖于zip的实现细节,这样,如果它获取列表[iter(x)] * n的每个元素的第一个元素,则等于前n个元素,因为在获取每个元素时,iter(x)的状态发生了变化.

这是因为下面的代码复制了上述行为:

n = 3
x = range(n ** 2)
xn = [iter(x)] * n

res = []

while True:    
        try:    
                col = []    
                for element in xn:    
                        col.append(next(element))    
                res.append(col)    
        except:    
                break

但是,我想确保情况确实如此,并且这是一种可靠的行为,可以用来分块可迭代的元素.

推荐答案

这并不是真正特定于zip,但你基本上有权这样做.实际上,它压缩了对同一迭代器的3个引用,导致它们之间的循环.在每次迭代期间,会从迭代器中再消耗一个元素.

实际上,这与这样做是一样的:

>>> n = 3
>>> x = range(n ** 2)
>>> a = b = c = iter(x)
>>> list(zip(a, b, c))
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]

请注意,它只生成大小相等的组,并且可能会删除元素(该部分是zip的特征,因为它受最小可迭代数的限制,不过如果您愿意,也可以使用itertools.zip_longest):

>>> n = 4
>>> x = range(n ** 2)
>>> a = b = c = iter(x)
>>> list(zip(a, b, c))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)]

Python相关问答推荐

Python—转换日期:价目表到新行

关于两个表达式的区别

如何设置nan值为numpy数组多条件

Python如何导入类的实例

简化通用属性的创建

使代码更快地解决哪个字母代表给定公式中的哪个数字

判断字典键、值对是否满足用户定义的搜索条件

将.exe文件从.py转换后出现问题.";ModuleNotFoundError:没有名为';Selify;的模块

Python-迭代PANAS中的数据框并替换列表中不包含字符串的值

Python:打开名称中带有最新时间戳的特定文件

有没有更快的方法来快速修改、更新和排序列表或词典?

如何从表示音频的Numy数组中提取持续时间和偏移量?

将CONTEXT_PROCESSOR数据返回到html进行循环时出现问题

如何根据预定义的模板重新排序YAML键并维护注释?

如何验证像这样添加的对象属性:MyObj.newattribute=123

Python中字符串排列的大O表示法

从具有独特 struct 的词典创建Pandas 数据帧

我如何在print和pd.Dataframe中返回仅在__post_init__中定义的Python数据类字段/值?

PYTHON中的regex与PostgreSQL等其他系统中的regex有区别吗?

在TKinter中将列表显示为多行标签