2017-03-10 55 views
7

昨天我有機會想以相反的順序迭代集合。我找到reverse函數,但這不會返回一個迭代器,但實際上會創建一個反轉的集合。Julia中的反向迭代

顯然,曾經有一個Reverse迭代器,它在幾年前是removed。我也可以找到reference來稱爲Order.Reverse的東西(類型?),但這似乎不適用於我的問題。

Iterators.jl包有許多有趣的迭代模式,但顯然不是反向迭代。

我當然可以使用reverse函數,並在某些情況下,例如reverse(eachindex(c))返回一個顛倒的迭代器,但我更喜歡一般的反向迭代器。

有這樣的事嗎?

回答

5

傑夫的評論時,他三年前刪除的反向迭代器(在the issue you linked)今天是一樣重要:

我非常贊成刪除此,因爲它根本不起作用的。與iterator.jl中的其他所有內容不同,它依賴於索引而不是迭代,甚至不適用於所有可索引的東西(例如UTF8String)。我討厭在基地有這樣的地雷。

在最基本的層次上,迭代器只知道如何做三件事:啓動迭代,獲取下一個元素,並檢查迭代是否完成。爲了創建一個不使用這些原語分配的迭代器,你需要一個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))

+0

我_did_閱讀了該評論,但我沒有把它作爲反向迭代不可行的含義。 Stefan Karpinski的評論也沒有給出這種印象。無論如何,你的論點很有意義,但是對於某些集合子集支持反向迭代是不切實際的。我看到Python確實有類似的東西:https://docs.python.org/3/library/functions.html#reversed – DNF

+0

不,它根本不是不切實際的。只是沒有人定義過這樣的界面 - 我們只需要有人來完成這個工作,我有一種感覺會被接受。參考。 https://github.com/JuliaLang/julia/issues/4590#issuecomment-26684029 –

+0

我明白了。那麼,這回答我的問題。 – DNF