【问题标题】:Julia equivalent of Ruby's each_consJulia 相当于 Ruby 的 each_cons
【发布时间】:2015-12-29 23:42:51
【问题描述】:

在 Ruby 中,有一个方法 each_cons,可用于迭代给定大小的连续组。例如,

irb(main):001:0> [4, 7, 6, 1, 0, 3].each_cons(2) { |x| p x }
[4, 7]
[7, 6]
[6, 1]
[1, 0]
[0, 3]
=> nil

这里我们从输入数组中选择并打印每对连续的元素。

在 Julia 中如何处理这个问题?

可以这样定义函数:

function eachcons(x::Array{Any,1}, n::Int)
    L = length(x)
    (L ≤ 1 || n > L) && return nothing   # Matches Ruby's behavior
    return [x[i-n+1:i] for i = n:L]
end

有没有比这个自定义函数更好或更惯用的方法?

【问题讨论】:

  • 请注意,从技术上讲,给定的函数更像是在做x.each_cons(n).to_a 但是¯\_(ツ)_/¯

标签: arrays iterator julia


【解决方案1】:

对于预制解决方案,partition 包中始终包含 partition 函数。该函数可以从数组中返回一个包含 n 个连续元素的元组:

julia> using Iterators
INFO: Precompiling module Iterators...

julia> A = [4, 7, 6, 1, 0, 3]

julia> for pair in Iterators.partition(A, 2, 1)
           println(pair)
       end
(4,7)
(7,6)
(6,1)
(1,0)
(0,3)

【讨论】:

  • 我总是忘记迭代器。我想知道为什么这些功能不包含在 Base.xml 中。那好吧。感谢您的帮助。
  • 在创建这个答案和 Julia 1.5.2 之间的一段时间,Iterators.partition 失去了它的三个参数形式,现在只需要两个参数,所以这个答案不再有效。
【解决方案2】:

Iterators.partition(...) 中的第三个参数消失了,真可惜。也许 Julia 未来版本中的新版本可能是:

Iterators.partition(enum, 3, advance = 1)

无论如何,刚才的解决方法是:

julia> zip(enum, enum[2:end], enum[3:end])

【讨论】:

    猜你喜欢
    • 2017-02-06
    • 2011-08-18
    • 2018-06-24
    • 2021-09-14
    • 2019-02-05
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    相关资源
    最近更新 更多