gpt4 book ai didi

iteration - Julia 的反向迭代

转载 作者:行者123 更新时间:2023-12-04 08:03:55 25 4
gpt4 key购买 nike

昨天我有机会想以相反的顺序遍历一个集合。我找到了reverse函数,但这没有返回迭代器,而是实际上创建了一个反向集合。

显然,过去有一个Reverse迭代器,几年前就是removed。我还可以找到reference到某种称为Order.Reverse的类型(类型?),但这似乎不适用于我的问题。

Iterators.jl 软件包具有许多有趣的迭代模式,但显然没有反向迭代。

我当然可以使用reverse函数,在某些情况下,例如返回返回反向迭代器的reverse(eachindex(c)),但我更喜欢通用的反向迭代器。

有这样的事吗?

最佳答案

JULIA 1.0以上版本的

现在,您可以使用Iterators.reverse反转类型的有限子集。例如:

julia> Iterators.reverse(1:10)
10:-1:1

julia> Iterators.reverse(CartesianIndices(zeros(2,3))) |> collect
2×3 Array{CartesianIndex{2},2}:
CartesianIndex(2, 3) CartesianIndex(2, 2) CartesianIndex(2, 1)
CartesianIndex(1, 3) CartesianIndex(1, 2) CartesianIndex(1, 1)

julia> Iterators.Reverse([1,1,2,3,5]) |> collect
5-element Array{Int64,1}:
5
3
2
1
1

# But not all iterables support it (and new iterables don't support it by default):
julia> Iterators.reverse(Set(1:2)) |> collect
ERROR: MethodError: no method matching iterate(::Base.Iterators.Reverse{Set{Int64}})

请注意,这仅适用于明确定义了反向迭代的类型。也就是说,他们专门定义了 Base.iterate(::Iterators.Reverse{T}, ...),其中T是自定义类型。因此,它不是完全通用的(出于下面记录的原因),但是它确实适用于支持它的任何类型。

原始答案

杰夫在三年前删除反向迭代器(在 the issue you linked中)时的评论与今天同样重要:

I am highly in favor of deleting this since it simply does not work. Unlike everything else in iterator.jl it depends on indexing, not iteration, and doesn't even work on everything that's indexable (for example UTF8String). I hate having landmines like this in Base.



在最基本的级别上,迭代器仅知道如何做三件事:开始迭代,获取下一个元素以及检查迭代是否完成。为了创建不使用这些原语进行分配的迭代器,您需要一个O(n ^ 2)算法:遍历整个迭代器,不断进行计数,直到找到最后一个元素。然后再次遍历迭代器,只是这次停在倒数第二个元素上。当然,它不会分配,但是它比将迭代器收集到数组然后向后索引要慢得多。对于一次迭代的迭代器(如 eachline),它将被完全破坏。因此,根本不可能创建有效的通用反向迭代器。

请注意, reverse(eachindex(c))通常无法正常工作:
julia> reverse(eachindex(sprand(5,5,.2)))
ERROR: MethodError: no method matching reverse(::CartesianRange{CartesianIndex{2}})

仍然适用于偏移量数组的一种替代方法是 reverse(linearindices(c))

关于iteration - Julia 的反向迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42713164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com