反转散列:从数组中创建多个散列键
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}
我正在尝试获取一个散列,该散列具有一组反转的值,这样键现在就是值。来自这样的表达式:
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}