【问题标题】:How can I interweave items from two arrays?如何将两个数组中的项目交织在一起?
【发布时间】:2012-01-22 02:03:44
【问题描述】:

我该怎么做:

for number in [1,2] do
    puts 1+number
    puts 2+number
    puts 3+number
end

这将返回2,3,4,然后是3,4,5 -> 2,3,4,3,4,5。这只是一个例子,显然不是真正的用途。

相反,我希望它返回2,3 3,4 4,5 -> 2,3,3,4,4,5。我希望对每个可能的数字值进行迭代;在这种情况下,12 是 'number' 的两个可能值,然后再继续下一个 put。

一种方法是创建两个列表[2,3,4][3,4,5],然后使用zip 方法将它们组合起来,如[2,3,4].zip([3,4,5]) -> [2,3,3,4,4,5]

【问题讨论】:

    标签: ruby iterable


    【解决方案1】:

    zip 很好。你也应该看看each_cons

    1.9.2p290 :006 > [2,3,4].each_cons(2).to_a
     => [[2, 3], [3, 4]] 
    1.9.2p290 :007 > [2,3,4,5,6].each_cons(2).to_a
     => [[2, 3], [3, 4], [4, 5], [5, 6]] 
    1.9.2p290 :008 > [2,3,4,5,6].each_cons(3).to_a
     => [[2, 3, 4], [3, 4, 5], [4, 5, 6]] 
    

    因为each_cons 返回一个枚举器,您可以使用它的块,如它的文档中所述,或者使用to_a 将其转换为数组,就像我在上面所做的那样。这将返回数组数组,可以将其展平以获得单个数组:

     [2,3,4,5].each_cons(2).to_a.flatten
     => [2, 3, 3, 4, 4, 5]
    

    来自ri 文档:

    为每个连续元素数组迭代给定块。如果不 给定块,返回一个枚举器。

    e.g.:
      (1..10).each_cons(3) {|a| p a}
      # outputs below
      [1, 2, 3]
      [2, 3, 4]
      [3, 4, 5]
      [4, 5, 6]
      [5, 6, 7]
      [6, 7, 8]
      [7, 8, 9]
      [8, 9, 10]
    

    【讨论】:

      【解决方案2】:
      [1, 2, 3].each { |i| [1, 2].each { |y| puts i + y  } }
      

      【讨论】:

        【解决方案3】:

        也许不是最易读的代码,但您可以在第一个范围上使用注入来根据汇总的第二个范围创建一个数组。

        (1..3).inject([]){|m,n| (1..2).each{|i| m<<n+i }; m }
        => [2, 3, 3, 4, 4, 5]
        

        这可能更具可读性

        res=[]
        (1..3).each{|r1| (1..2).each{|r2| res<<r1+r2 } }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-29
          • 1970-01-01
          • 2011-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-03
          • 1970-01-01
          相关资源
          最近更新 更多