作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Julia 中,推荐的方法是迭代 AbstractArray
的所有索引是使用 eachindex
,例如,
for i in eachindex(a)
do_something(a[i], i)
end
1:length(a)
,
eachindex(a)
支持具有非常规索引的数组,即索引不是从
1
开始的.此外,对于线性索引较慢的数组,它更有效。
Iterators.drop(eachindex(a), 1)
(有更好的方法吗?)但是我如何以通用方式跳过最后一个?
最佳答案
“前端”迭代器相对简单且通常很有用。 编辑 :仅针对这种情况就完全通用地定义它也是完全矫枉过正的。依赖具有如下定义的 Base 内置函数要容易得多:
front(itr, n=1) = Iterators.take(itr, length(itr)-n)
length
的迭代器定义 - 将包括
eachindex
的所有内容将返回。
length
的基本原理定义专门的迭代器。被定义。我不知道任何现有包中有这样的结构。使用 Julia 0.6,实现可能如下所示:
struct Front{T}
itr::T
end
# Basic iterator definition
function Base.start(f::Front)
s = start(f.itr)
done(f.itr, s) && throw(ArgumentError("cannot take the front of an empty iterator"))
return next(f.itr, s)
end
function Base.next(f::Front, state)
val, s = state
return val, next(f.itr, s)
end
Base.done(f::Front, state) = done(f.itr, state[2])
# Inherit traits as appropriate
Base.iteratorsize(::Type{Front{T}}) where {T} = _dropshape(Base.iteratorsize(T))
_dropshape(x) = x
_dropshape(::Base.HasShape) = Base.HasLength()
Base.iteratoreltype(::Type{Front{T}}) where {T} = Base.iteratoreltype(T)
Base.length(f::Front) = length(f.itr) - 1
Base.eltype(f::Front{T}) where {T} = eltype(T)
julia> collect(Front(eachindex(rand(5))))
4-element Array{Int64,1}:
1
2
3
4
julia> collect(Front(eachindex(sprand(3, 2, .2))))
5-element Array{CartesianIndex{2},1}:
CartesianIndex{2}((1, 1))
CartesianIndex{2}((2, 1))
CartesianIndex{2}((3, 1))
CartesianIndex{2}((1, 2))
CartesianIndex{2}((2, 2))
关于iteration - 如何迭代除 AbstractArray 的最后一个索引之外的所有索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43641012/
在 Julia 中,推荐的方法是迭代 AbstractArray 的所有索引是使用 eachindex ,例如, for i in eachindex(a) do_something(a[i]
我是一名优秀的程序员,十分优秀!