gpt4 book ai didi

ruby - 将 2 元素数组的数组转换为散列,其中重复的键附加附加值

转载 作者:数据小太阳 更新时间:2023-10-29 06:24:58 26 4
gpt4 key购买 nike

例如

给定一个数组:

array = [[:a,:b],[:a,:c],[:c,:b]]

返回以下哈希值:

hash = { :a => [:b,:c] , :c => [:b] }

hash = Hash[array] 覆盖以前的关联,产生:

hash = { :a => :c , :c => :b }

最佳答案

使用功能性婴儿步骤:

irb:01.0> array = [[:a,:b],[:a,:c],[:c,:b]]
#=> [[:a, :b], [:a, :c], [:c, :b]]

irb:02.0> array.group_by(&:first)
#=> {:a=>[[:a, :b], [:a, :c]], :c=>[[:c, :b]]}

irb:03.0> array.group_by(&:first).map{ |k,a| [k,a.map(&:last)] }
#=> [[:a, [:b, :c]], [:c, [:b]]]

irb:04.0> Hash[ array.group_by(&:first).map{ |k,a| [k,a.map(&:last)] } ]
#=> {:a=>[:b, :c], :c=>[:b]}

使用命令式编程:

irb:10.0> h = Hash.new{ |h,k| h[k]=[] }
#=> {}

irb:11.0> array.each{ |k,v| h[k] << v }
#=> [[:a, :b], [:a, :c], [:c, :b]]

irb:12.0> h
#=> {:a=>[:b, :c], :c=>[:b]}

作为命令式的一行:

irb:13.0> h = Hash.new{ |h,k| h[k]=[] }.tap{ |h| array.each{ |k,v| h[k] << v } }
#=> {:a=>[:b, :c], :c=>[:b]}

或者使用大家最喜欢的inject:

irb:14.0> array.inject(Hash.new{ |h,k| h[k]=[] }){ |h,(k,v)| h[k] << v; h }
#=> {:a=>[:b, :c], :c=>[:b]}

如果您真的想让单个值作为数组不发生碰撞,您可以在后处理步骤中取消排列它们,或者使用仅在碰撞时创建数组的不同哈希累积策略。或者,围绕这个思考:

irb:17.0> hashes = array.map{ |pair| Hash[*pair] } # merge many mini hashes
#=> [{:a=>:b}, {:a=>:c}, {:c=>:b}]

irb:18.0> hashes.inject{ |h1,h2| h1.merge(h2){ |*a| a[1,2] } }
#=> {:a=>[:b, :c], :c=>:b}

关于ruby - 将 2 元素数组的数组转换为散列,其中重复的键附加附加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com