2015-12-17 38 views
4

julia中通過for循環循環時獲取兩個相鄰元素的快速方法是什麼?Julia - 在for循環中訪問兩個元素

假設我有

z = linspace(1, 10, 9) 
for i in z[1:length(z)-1] 
    println(i, " ") 
end 

我可以以某種方式得到這兩個元素i和下一個i+1

回答

10

是的,這是可能的。由於它很常見,所以在Iterators.jl中定義了一個特殊的迭代器來處理這種類型的任務。其他特殊的迭代器也非常有用(從個人經驗),值得研究。

using Iterators # may have to Pkg.add("Iterators") first 

z = linspace(1,10,9) 
for (v1,v2) in partition(z,2,1) 
    @show v1,v2 
end 

的參數的partition2,1是大小和所述元組的步驟。

+4

BTW的StackOverflow剛纔問我傳遞一個CAPTCHA來證明我是人。坦率地說,如果機器人可以回答StackOverflow問題,那麼可能是時候把靴子掛好了。 –

3

參考朱莉婭Doc,一般for環路朱莉婭:

for i = I # or "for i in I" 
    # body 
end 

被翻譯成while結構:

state = start(I) 
while !done(I, state) 
    (i, state) = next(I, state) 
    # body 
end 

因此,使用相同的語法,一個可以簡單地實現定製&高效循環,例如下面的一個,在每次迭代中提取兩個相鄰的元素:

I=linspace(1, 10, 9) 
state = start(I) 
while !done(I, state) 
    (i, state) = next(I, state) # 
    (j, _)  = next(I, state) # extract next element without update state 
    println(i,' ',j) 
end 
#= > 
1.0 2.125 
2.125 3.25 
3.25 4.375 
4.375 5.5 
5.5 6.625 
6.625 7.75 
7.75 8.875 
8.875 10.0 
10.0 11.125 
< =# 
2

我很喜歡reduce()

julia> z = linspace(1, 10, 10); 
julia> reduce((x, y) -> (println("$x + $y = $(x+y)"); y), z) 
1.0 + 2.0 = 3.0 
2.0 + 3.0 = 5.0 
3.0 + 4.0 = 7.0 
4.0 + 5.0 = 9.0 
5.0 + 6.0 = 11.0 
6.0 + 7.0 = 13.0 
7.0 + 8.0 = 15.0 
8.0 + 9.0 = 17.0 
9.0 + 10.0 = 19.0 
10.0 

的想法是對的功能背後的第二個值留下,以便它可以被用作下一對的第一個值。

你可以倒着走,如果你使用foldr(),返回的第一個值:

julia> foldr((x, y) -> (println("$x + $y = $(x+y)"); x), z) 
9.0 + 10.0 = 19.0 
8.0 + 9.0 = 17.0 
7.0 + 8.0 = 15.0 
6.0 + 7.0 = 13.0 
5.0 + 6.0 = 11.0 
4.0 + 5.0 = 9.0 
3.0 + 4.0 = 7.0 
2.0 + 3.0 = 5.0 
1.0 + 2.0 = 3.0 
1.0