【问题标题】:splitting an array of arrays, [0] into one, [1] into another将数组数组拆分,将 [0] 拆分为一个,将 [1] 拆分为另一个
【发布时间】:2019-02-04 11:10:15
【问题描述】:

我有一个基本数组[[1,2],[2,4],[3,6]]

我想把它分成两个数组,这样......

a = [1,2,3]
b = [2,4,6]

【问题讨论】:

    标签: ruby-on-rails arrays ruby


    【解决方案1】:

    您可以简单地使用Array#transpose,如下所示,

    arr = [[1,2],[2,4],[3,6]]
    # => [[1, 2], [2, 4], [3, 6]] 
    
    a, b = arr.transpose
    # => [[1, 2, 3], [2, 4, 6]] 
    a
    # => [1, 2, 3] 
    b
    # => [2, 4, 6] 
    

    【讨论】:

    • transpose 最好 +1
    • 任何使用transpose 的东西都确实会获得支持:)
    【解决方案2】:
    c = [[1,2],[2,4],[3,6]]
    

    您可以使用 map 并插入到两个不同的数组中

    a = c.map{|x,y| x}
    # => [1, 2, 3]
    
    b = c.map{|x,y| y}
     #=> [2, 4, 6]
    

    编辑作为@DaveMongoose 评论你也可以这样写

    a = c.map(&:first)
    b = c.map(&:last)
    

    【讨论】:

    • 这些也可以写成a = c.map(&:first)b = c.map(&:last)
    【解决方案3】:

    一种方法是使用each 之类的函数,并利用 Ruby 的自动数组拆分:

    ary = [[1,2],[2,4],[3,6]]
    a = []
    b = []
    
    ary.each{|first,second| a << first; b << second}
    # The entry [1,2] is automatically split into first = 1 and second = 2
    

    如果你愿意,你也可以使用each_with_object在单个方法调用中编写它

    a,b = ary.each_with_object([[],[]]) do |(first, second), result|
      result[0] << first
      result[1] << second
    }
    

    第三种选择是使用Array.zip

    a,b = ary[0].zip(*ary[1..-1])
    

    zip 通过将具有相同索引的条目配对来组合数组(正如您在此处所做的那样)。这里的* 是 splat 运算符,它将数组数组解包成一系列参数。

    【讨论】:

    • 这里最好的方法是transposeeach 应该只在没有更具体的方法可以完成这项工作时使用。
    • @SergioTulentsev 原来如此!我完全忘记了transpose
    • 很高兴知道如何在不转置的情况下做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2012-05-28
    相关资源
    最近更新 更多