如何使用pairs或eachindex遍历Julia中的乘积生成器?
解决生成器的索引-值枚举问题
你遇到的问题根源在于:多维生成器(比如(i+j for i in 1:10, j in 1:10))本质是Base.Generator包装的乘积迭代器,它没有实现pairs或eachindex所需的多维索引接口,所以直接调用会失败。不过有两种常见思路实现类似需求:
1. 惰性枚举(保留生成器的内存优势)
如果不想提前分配内存生成数组,可以用CartesianIndices生成对应维度的多维索引,再和生成器的值配对迭代:
g = (i+j for i in 1:10, j in 1:10) # 用CartesianIndices生成多维索引,和生成器值一一对应 for (idx, val) in zip(CartesianIndices(size(g)), g) # idx是CartesianIndex类型,比如CartesianIndex(1,2),对应i=1,j=2的位置 println("位置: $idx, 值: $val") end
如果需要线性索引(类似数组的eachindex返回的整数索引),可以用LinearIndices替代:
for (idx, val) in zip(LinearIndices(size(g)), g) println("线性索引: $idx, 值: $val") end
2. 先转为数组(简单直接,适合小数据)
如果数据量不大,直接用collect把生成器转为多维数组,再用pairs枚举:
arr = collect(i+j for i in 1:10, j in 1:10) for (idx, val) in pairs(arr) println("索引: $idx, 值: $val") end
这个方法的缺点是会提前分配内存存储整个数组,失去生成器的惰性计算优势。
内容的提问来源于stack exchange,提问作者Bubaya
相关产品推荐
相关产品推荐

