【问题标题】:How to find mapping between two hashes/dictionaries如何找到两个哈希/字典之间的映射
【发布时间】:2014-09-02 13:24:06
【问题描述】:

我有两个哈希/字典。

第一个哈希代表价格桶,看起来像:

hash = {"499 & Under" => "0 TO 499", "500 - 999" => "500 TO 999", "1000 - 1499" => "1000 TO 1499", 
"1500 - 2499" => "1500 TO 2499", "2500 & Above" => "2500 TO *"}

第二个哈希对应于给定桶中的项目数,但它只有桶的下限作为键。它看起来像:

{0=>3605, 500=>3078, 1000=>1656, 1500=>743, 2000=>333}

第二个哈希的桶大小为 500。此外,我还有第二个哈希的任何桶中不适合的项目数量的信息(在本例中为 >2500)。

我想在这两个哈希之间创建一个映射。

到目前为止我做了什么:

buckets = {"499 & Under" => "0 TO 499", "500 - 999" => "500 TO 999", "1000 - 1499" => "1000 TO 1499", "1500 - 2499" => "1500 TO 2499", "2500 & Above" => "2500 TO *"}
counts = {0=>3605, 500=>3078, 1000=>1656, 1500=>743, 2000=>333}
gap = 500      ##bucket size of counts hash
after = 681    ##num of items not in any bucket

x = counts
counts = Hash[x.map{|k,v| ["#{k.to_s} TO #{k+gap-1}",v]}]
##{"0 TO 499"=>3605, "500 TO 999"=>3078, "1000 TO 1499"=>1656, "1500 TO 1999"=>743, "2000 TO 2499"=>333}
counts["#{x.keys.max+gap} TO *"] = after
##{"0 TO 499"=>3605, "500 TO 999"=>3078, "1000 TO 1499"=>1656, "1500 TO 1999"=>743, "2000 TO 2499"=>333, "2500 TO *"=>681}

如何合并计数哈希中的两个元素:

"1500 TO 1999"=>743, "2000 TO 2499"=>333

获取计数:

"1500 - 2499" => "1500 TO 2499"

价格区间?

【问题讨论】:

  • @jonrsharpe:我将其标记为 python,因为逻辑与语言无关,并且哈希和字典的相似性无关紧要
  • 如果这确实是一个与语言无关的问题(即概念性、算法性),请在 Computer Science 堆栈交换中提问。如果您想知道如何使用特定语言执行此操作,则可以在此处使用,但应按此进行标记。

标签: ruby dictionary hashmap


【解决方案1】:

也许不是最优雅的方式,但这会奏效:

 hash = {"499 & Under" => "0 TO 499", "500 - 999" => "500 TO 999", "1000 - 1499" => "1000 TO 1499","1500 - 2499" => "1500 TO 2499", "2500 & Above" => "2500 TO *"}
 counts = {0=>3605, 500=>3078, 1000=>1656, 1500=>743, 2000=>333, 2500 => 4}
 value_ranges = value_ranges = Hash[hash.values.map do |v|
                  starting,stopping = v.split("TO").map(&:to_i)
                  [v,(starting..stopping)]
                end]
 #=> {"0 TO 499"=>0..499, "500 TO 999"=>500..999, "1000 TO 1499"=>1000..1499, "1500 TO 2499"=>1500..2499, "2500 TO *"=>2500..0}
 result_hash = Hash[counts.map do |k,v|
                   [value_ranges.collect{|words,range| words if range.include?(k)}.compact.pop || "2500 TO *",v]
               end]
 #=> {"0 TO 499"=>3605, "500 TO 999"=>3078, "1000 TO 1499"=>1656, "1500 TO 2499"=>333, "2500 TO *"=>4}

就像我说的那样,它缺乏优雅和可读性,但它会产生结果。不确定这些数据来自哪里,但在这个结构中构建原始的 Hash 似乎比之后合并 2 更容易。

【讨论】:

  • "1500 TO 2499"=>333 似乎不正确。应该是"1500 TO 2499"=>1076(333+743)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
相关资源
最近更新 更多