反转散列:从数组中创建多个散列键

Inverting a hash: Making multiple hash keys from an array

我正在尝试获取一个散列,该散列具有一组反转的值,这样键现在就是值。来自这样的表达式:

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

我试图得到这个结果:

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

我有这个:

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

但是这些键都是作为单独的键分开的(没有分组)。它returns:

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

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

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

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

您正在使用 first 来展平数组。

另一种方式:

class Whosebug
  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'] }
Whosebug.transform(old)
  #=> {"A"=>1, "E"=>1, "B"=>2}