【问题标题】:How can I fill a hash with an array of values from another hash? [closed]如何用来自另一个散列的值数组填充散列? [关闭]
【发布时间】:2012-11-16 00:00:18
【问题描述】:

为清楚起见编辑第二版:

我有以下哈希值:

样本输入 ->

hashweek={[43,2011]=>[0,0,0],[44,2011]=>[0,0,0],**[45,2011]=>[0,0,0]**,[1,2012]=>[0,0,0],[2,2012]=>[0,0,0]}
timesRealCum={[43,2011]=>1000,[44,2011]=>1100,[1,2012]=>1200,[2,2012]=>1300}

预期输出 ->

hashweek={[43,2011]=>[1000,0,0],[44,2011]=>[1100,0,0],**[45,2011]=>[1100,0,0]**,[1,2012]=>[1200,0,0],[2,2012]=>[1300,0,0]}

假装的是,在迭代 timesRealCum 或 hashweek 或任何适当的方法时,hashweek[0] 值应更新为包含来自 timesRealCum 的相应值,或者如果未出现在 timesRealCum 哈希中,则为最后一个重要值。

【问题讨论】:

  • 为了清楚起见,我们能否获得您想要的样本输入和预期输出?此外,timesRealCum 是一个尴尬的名称选择:p
  • 是否有 timesFakeCum 变量? ;)
  • 开个玩笑,但应该指出 hash_week 和 times_real_cum 样式在 Ruby 代码中更常见。

标签: ruby arrays hash key-value


【解决方案1】:

好的,这就够了:

timesRealCum.each{|k, v| hashweek[k][0] = v}

没有测试 nil 值,所以如果您希望在 hashweek 中缺少键,您必须测试 hashweek[k] 存在和 hashweek[k][0]

timesRealCum.each{|k, v| hashweek[k][0] = v if hashweek[k] && hashweek[k][0]}

编辑:所以如果我理解正确,如果 timesRealCum 中没有条目,你想在 hashweek 循环时取最后一个分配的值?

last_v = 0
hashweek.each{|k, v| last_v = v[0] = timesRealCum[k] || last_v }

【讨论】:

  • 几乎正确,但位置 hashweek[45,2011] 仍然是 [0,0,0] 而不是 [1100,0,0] 预期。感谢您的回复。
  • 我不知道你的意思,这改变了 hashweek,我将粘贴我的 irb 输出
  • 是的,hashweek 已经更新,但是那一周 [45,2011] 应该是 [1100,0,0]。通过我的问题第一个版本,我意识到它并不明确。尝试将 hashweek[0] 视为 timesRealCum 中值的累加器,即使该键在 timesRealCum 中不存在
  • 好的编辑了我的答案,它应该可以工作
  • 就是这样。感谢您的及时和及时。
【解决方案2】:

如果 timesRealCum 不包含周和年,下面这个使用注入来保持累积值。现在它为 [45, 2011] 返回 [1100, 0, 0]。

hashweek.inject(0) do |mem, kv_pair|
  hashweek[kv_pair.first] = [timesRealCum[kv_pair.first]||mem, kv_pair.last[1..-1]].flatten
  mem = hashweek[kv_pair.first][0]
end

p hashweek
#=> {[43, 2011]=>[1000, 0, 0], [44, 2011]=>[1100, 0, 0], [45, 2011]=>[1100, 0, 0], [1, 2012]=>[1200, 0, 0], [2, 2012]=>[1300, 0, 0]}

【讨论】:

  • 与 Anthony 的结果相同,位置 hashweek[45,2011] 仍然是 [0,0,0],而不是预期的 [1100,0,0]。感谢您的回复。
  • 好的,但是为什么 hashweek[45, 2011] 需要是 [1100, 0, 0] 而不是 [0, 0, 0]。无法从您的描述中找到算法。
  • 数组的第一个位置包含随时间累积的值。虽然 hashweek 包含所有可能的周/年,但 timesRealCum 可能不包含该周/年的值。
  • @user1826611:inject 设置了一个局部变量来解决问题,应该不会损害您的代码库。
  • 您的解决方案同样有效。感谢你的回复。我接受了 Anthony 解决方案,因为对我来说更清楚。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2018-12-28
  • 2022-01-09
  • 2011-02-03
  • 2021-02-04
相关资源
最近更新 更多