【问题标题】:Using Enumerable#zip on an Array of Arrays在数组数组上使用 Enumerable#zip
【发布时间】:2013-09-05 00:11:50
【问题描述】:

我试图在数组数组上使用Enumerable#zip,以便将第一个嵌套数组的元素与每个后续嵌套数组的相应元素分组。这是我的数组:

roster = [["Number", "Name", "Position", "Points per Game"],
          ["12","Joe Schmo","Center",[14, 32, 7, 0, 23] ],
          ["9", "Ms. Buckets ", "Point Guard", [19, 0, 11, 22, 0] ],
          ["31", "Harvey Kay", "Shooting Guard", [0, 30, 16, 0, 25] ], 
          ["7", "Sally Talls", "Power Forward", [18, 29, 26, 31, 19] ], 
          ["22", "MK DiBoux", "Small Forward", [11, 0, 23, 17, 0] ]]

我想将“数字”与“12”、“9”、“31”、“7”和“22”分组,然后使用 zip 对“姓名”、“职位”等进行相同的操作.以下给了我想要的输出:

roster[0].zip(roster[1], roster[2], roster[3], roster[4], roster[5])

我如何重新格式化它,以便如果我将球员添加到我的名单中,他们将自动包含在zip 中,而无需我手动输入roster[6]roster[7] 等。我尝试使用范围有多种方式,但似乎还没有任何效果。

【问题讨论】:

    标签: ruby arrays enumerable


    【解决方案1】:
    p roster.transpose()
    

    .......................

    【讨论】:

    • 这缺乏细节。请详细说明。
    • 在变量名 'roster' 之后,输入一个点,然后是 't',然后是 'r',然后是 'a',然后是 'n',然后是 's',然后一个“p”,然后一个“o”,然后一个“s”,然后一个“e”。要输出变量,您可以使用 puts 或 p,它代表“检查”。如果您使用 puts 输出一个数组,它将在换行符上打印数组的每个元素,这使得很难弄清楚发生了什么。如果你输出一个带有 p 的数组,它会显示数组的元素,用逗号分隔,数组周围有括号。
    • Ruby 是由出生于 1965 年 4 月 14 日的日本计算机科学家 Yukihiro Matsumoto 发明的语言,Ruby 最近发布了 2.x 版本。 transpose() 是 ruby​​ 方法,它是 Array 类的方法。 puts 和 p 是 Kernel 模块的私有方法,但是因为 Object 类包含了 Kernel 模块,所以 puts 和 p 可以在任何地方调用。
    【解决方案2】:
    :zip.to_proc[*roster]
    

    transpose灵活一点:

    :zip.to_proc[*[(0..2), [:a, :b, :c]]] #=> [[0, :a], [1, :b], [2, :c]]

    【讨论】:

    • 不错,它还支持不同大小的列表。 :zip.to_proc[*[[1,2],[4,5,6]]] -> [[1, 4], [2, 5]] 而转置给出错误:IndexError: element size differs (3 should be 2)
    【解决方案3】:

    首先使用 splat 提取列表的头部和尾部(分别是标题和行),然后将它们 zip 一起提取:

    header, *rows = roster
    header.zip(*rows)
    

    这与在原始roster 上使用transpose 相同:

    header, *rows = roster
    zipped = header.zip(*rows)
    
    roster.transpose == zipped  #=> true
    

    【讨论】:

    • 谢谢 - 您的两个建议都有效。我同意,转置是我不知道它存在的合适方法。
    • @DougMill 如果这回答了你的问题,别忘了upvote/accept it:)
    • 我喜欢这个解决方案。谢谢。
    【解决方案4】:
    roster[0].zip(*(roster[1..-1]))
    

    花名册数组中有多少无关紧要。

    【讨论】:

    • 我想这是被同一个人否决了,他否决了下面完美优雅的答案。 OP 已经了解 zip 方法。他们只是说他们尝试了各种范围,但都无法奏效。这里已经有其他很好的答案了,我只是展示了一个范围如何工作,无论他们后来添加多少玩家。
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多