【问题标题】:How to "unflatten" a Ruby Array?如何“解压”一个 Ruby 数组?
【发布时间】:2011-10-21 05:31:51
【问题描述】:

我目前正在尝试转换这个 ruby​​ 数组:

[5, 7, 8, 1]

进入这个:

[[5], [7], [8], [1]]

我目前正在这样做:

[5, 7, 8, 1].select { |element| element }.collect { |element| element.to_a }

但我收到以下警告:

warning: default `to_a' will be obsolete

【问题讨论】:

    标签: ruby arrays


    【解决方案1】:

    最短最快的解决方案是使用Array#zip

    values = [5, 7, 8, 1]
    values.zip # => [[5], [7], [8], [1]]
    

    另一种可爱的方式是使用transpose

    [values].transpose # =>  [[5], [7], [8], [1]]
    

    最直观的方法可能是@Thom 建议的:

    values.map { |e| [e] }
    

    【讨论】:

      【解决方案2】:

      无点风格:

      [5, 7, 8, 1].map(&method(:Array))
      
      【解决方案3】:

      试试这个:

      [5, 7, 8, 1].map {|e| [e]}
      

      【讨论】:

      • 太棒了!我不知道我可以这么直接!
      • 这个答案是正确的,尽管这个问题的措辞可能应该不同。当一个数组被展平时,所有维度都被解析为一个。没有办法知道最初的安排是什么(至少我想不出一个)。您的答案应该是“我如何获取一个数组并用数组的第零个元素中的每个元素替换它自己,例如 [0,1] 变为 [[0],[1]]”之类的东西更清楚一点......只是说当我看到这个话题时我就像'哇,不可能'
      • @Thom: 你说的是mapcollectselect 是别的东西(在 Smalltalk 中也称为 select,在其他一些语言中也称为 filter)。参见例如smalltalk.gnu.org/blog/sblinn/…
      【解决方案4】:

      你所做的并没有什么特别的问题。我认为他们的意思是,FixNum 的 to_a 将在未来某个时候被弃用,这是有道理的,因为它的 to_a 究竟应该做什么是模棱两可的。

      你可以像这样重写你的行来消除错误:

      [5, 7, 8, 1].select { |element| element }.collect { |element| [element] }
      

      【讨论】:

      • 在这种情况下选择是无操作的;不过,它会过滤掉 nil。
      • 你们说的都是对的,我只是关注了罪魁祸首的代码,其余的没有关注。
      【解决方案5】:

      你可以这样做:

      [5, 7, 8, 1].collect { |i| [i] }
      

      【讨论】:

      • 正确答案,不过和Thom的一模一样,这个是4秒后。
      • 迟到的评论,但是当我看到他的回答时,我再次点赞了 Thom。
      • 在两个多月后拒绝投票的还有其他原因吗?
      • 投票可以随时进行。本网站旨在供任何人随时重复使用。寻求答案的不仅仅是原始 OP。 Downvoting 只是给未来用户的一个信号,这样他们就不必注意重复的答案。理想情况下,应删除重复的答案。
      • 理想情况下应该删除重复的问题。重复的答案应该表明答案非常好(不包括答案小时+之后,这表明缺乏阅读)如果有两个在时间上非常接近的正确答案 - 赞成第一个或至少提供一个不错的解释四秒时差。
      猜你喜欢
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      相关资源
      最近更新 更多