【问题标题】:Return first x values from each key in a hash从散列中的每个键返回前 x 个值
【发布时间】:2014-05-07 20:45:35
【问题描述】:

在下面的哈希中,我想从每个键返回第一个 'x' 值:

my_hash = {
  :key_one =>["one", "two", "three", "four", "five"], 
  :key_two =>["one", "two", "three", "four", "five"]
} 

不改变散列的结构,即键保持不变。 'x' 为 2 时的预期输出:

my_hash = {
  :key_one => ["one", "two"], 
  :key_two => ["one", "two"]
} 

问题是如何“很好地”做到这一点 - 我可以创建一个新的哈希,但这既麻烦又丑陋,即使键的数量没有增加,它们可能会增加。

{
  :key_one => my_hash[:key_one].first(2),
  :key_two => my_hash[:key_two].first(2)
}

【问题讨论】:

  • 那么,到目前为止你做了什么?你被困在哪里了?
  • @FelixFrank,见编辑。

标签: ruby hash


【解决方案1】:
my_hash = {
  :key_one =>["one", "two", "three", "four", "five"], 
  :key_two =>["one", "two", "three", "four", "five"]
}

Hash[ my_hash.map { |k,v| [ k, v.first(2) ] } ]

# => {:key_one=>["one", "two"], :key_two=>["one", "two"]}

参考资料:

  • Hash[]构造函数
  • Hash 是一个 Enumerable,因此可以访问 Enumerable#map,并遍历 [key,value] 对。

【讨论】:

  • 啊啊啊啊啊啊啊啊! :)
【解决方案2】:

使用Array#take 的另一种方式:

my_hash = {
  :key_one =>["one", "two", "three", "four", "five"], 
  :key_two =>["one", "two", "three", "four", "five"]
}

my_hash.map { |k,v| [ k, v.take(2) ] }.to_h
# => {:key_one=>["one", "two"], :key_two=>["one", "two"]}

【讨论】:

  • 在这种情况下使用 take 有什么好处?
  • 有任何理由使用Array#take 而非Array#first
  • @MikeH-R 有什么理由不使用它..?它在 API 中,所以我们可以使用它..对吗?
  • @kiddorails 看 - ruby-doc.org/core-2.1.1/Array.html#method-i-to_h .. 2.0.0 中没有引入.. 从2.1 开始..
  • 太棒了。我认为它是从 2.0.0 开始支持的。感谢您澄清@ArupRakshit :)
【解决方案3】:

还有国家/地区引导:

Hash[ my_hash.map {|key, val| key, val[0...x] } ]

其中 x 是您想要的值的数量;)

【讨论】:

  • Darnit Neil Slater 打败了我 xD
【解决方案4】:

给你:

my_hash
# => {:key_one=>["one", "two", "three", "four", "five"],
# :key_two=>["one", "two", "three", "four", "five"]}
my_hash.map {|k,v| [k, v.first(2)]}.to_h
# => {:key_one=>["one", "two"], :key_two=>["one", "two"]}

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多