【问题标题】:Ruby Arrays: keep repeated values only from the end of an array of arraysRuby Arrays:仅保留来自数组数组末尾的重复值
【发布时间】:2014-08-11 19:18:24
【问题描述】:

如果我有一个数组数组:

[[1, "foo"], [2, "bar"], [3, "foo"], [4, "foo"], [5, "bar"], [6, "baz"]]

如何消除重复值,将重复值保留在数组的末尾,结果是:

[[4, "foo"], [5, "bar"], [6, "baz"]]

谢谢!

我尝试了很多方法,例如遵循荒谬的路线,但没有成功。

a.delete_if {|q| q if q[1] in a}   # syntax error

a.each {|q| q.shift if q[1] in a[q][1]} # syntax error

还有更多。 . .

【问题讨论】:

  • 您需要定义“重复值”的含义。根据您的示例,如果b 遵循ab.last==a.last,您的意思似乎是ba 的重复值。
  • 仅供参考,您收到语法错误的原因是因为“in”在 Ruby 中不像那样工作。我猜你正在寻找类似于 Python 中的数组推导的东西?
  • @Ajedi32,没错,我对 Ruby 比较陌生,去年学会了 Python 编程。
  • 酷。我不想在这里讨论太多细节,因为 cmets 并不是真正用于扩展讨论,但基本上 Ruby 中的块更像循环而不是数组推导式。这可能会让你感兴趣:stackoverflow.com/q/4769004/1157054 反过来:stackoverflow.com/questions/4769478/…

标签: ruby arrays


【解决方案1】:

应该这样做:

a.reverse.uniq(&:last).reverse
=> [[4, "foo"], [5, "bar"], [6, "baz"]]

【讨论】:

    【解决方案2】:
     arr.group_by{|x|x[1]}.values.map(&:last)
    

    【讨论】:

      【解决方案3】:

      也可以使用 Ruby 的Hash 技术来解决:

      哈希是唯一键及其值的类字典集合。也叫关联数组,....

      array = [[1, "foo"], [2, "bar"], [3, "foo"], [4, "foo"], [5, "bar"], [6, "baz"]]
      Hash[array].invert.map { |k,v| [v,k] } 
      # => [[4, "foo"], [5, "bar"], [6, "baz"]]
      

      更新正如@Uri 建议的那样 -

      Hash[array].invert.invert.to_a
      

      【讨论】:

      • 为什么不简单地Hash[array].invert.invert.to_a
      • @UriAgassi 谢谢.. :-)
      猜你喜欢
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多