【问题标题】:Inverting a hash: Making multiple hash keys from an array反转哈希:从数组中生成多个哈希键
【发布时间】:2015-04-24 23:27:22
【问题描述】:

我正在尝试获取一个哈希值,该哈希值具有一个反转的值数组,使得键现在是值。从这样的表达式:

StackOverflow.transform({ 1 => ['A', 'E'] , 2 => ["B"]})

我正在尝试得到这个结果:

{"A"=>1, "E"=>1, "B"=>2}

我有这个:

class StackOverflow
  def self.transform(old)
    a = Hash[old.map { |k,v| v.product([k]) }.first]
  end
end

但所有键都作为单独的键分开(未分组)。它返回:

{"A"=>1, "E"=>1}

我也在尝试对键进行小写,但我觉得在我正确地解决了这个反转问题之后,我也能够(希望?)弄清楚小写逻辑。

【问题讨论】:

  • 我更喜欢@Mark 使用flat_map,但另一种选择是将first 替换为flatten(1)。
  • 这是stackoverflow.com/questions/7513730/hash-invert-in-ruby 的副本,尽管可能值得放弃,因为@MarkThomas 的答案比我在上一个问题中看到的任何答案都好?
  • 这与@Sid 极为相似,但不幸的是,我找不到适合我的情况的好答案。感谢您留下它。不幸的是,我投了反对票(可能是因为这个)——但我向人们保证,在发布问题之前,我会尽可能多地搜索 StackO。

标签: ruby arrays hash


【解决方案1】:

你们很亲密。您想使用flat_map 而不是first。

class StackOverflow
  def self.transform(old)
    Hash[old.flat_map { |k,v| v.product([k]) }]
  end
end

您使用first 来展平数组。

【讨论】:

    【解决方案2】:

    另一种方式:

    class StackOverflow
      def self.transform(old)
        val = nil
        old.each_with_object(Hash.new { |h,k| h[k]=val }) do |(k,v),h|
          val = k
          h.values_at(*v)
        end
      end
    end
    
    old = { 1=>['A', 'E'], 2=>['B'] }
    StackOverflow.transform(old)
      #=> {"A"=>1, "E"=>1, "B"=>2} 
    

    【讨论】:

      猜你喜欢
      • 2012-11-19
      • 2016-10-07
      • 2021-12-07
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2019-05-23
      • 1970-01-01
      相关资源
      最近更新 更多