我需要一些帮助来弄清楚如何做到这一点。我知道你是用Hashes做的,所以这就是我到目前为止所做的。
count = Hash.new()
speech {|word| count[word] += 1}
之后我就被困住了。如何回归前10个单词?它会是这样的吗?
count.sort
return count[1..10]
另外,我如何排除列表中我不想包含的任何单词?它会是这样的吗?
wanted_words = speech.select { |word| !excluded_words.include?(word) }
Arup的详细说明:
所以说我有这个哈希:
hash = Hash.new()
hash["cats"] = 1
hash["blaks"] = 2
hash["Pogs"] = 13
hash["Dogs"] = 12
如何创建具有最大值的前2个单词列表? 基本上,我希望“Pogs”和“Dogs”返回,因为它们具有最大的值(分别为13和12)。
答案 0 :(得分:1)
您可以使用方法#max_by
。
max_by(n)→obj
如果给出了
n
参数,则最小n
个元素将作为数组返回。
count.max(10) { |_, v| v }
根据第二个问题,使用#reject
:
speech.reject { |word| excluded_words.include?(word) }
虽然#reject!
有 bang 版本。使用哪一个符合您的需要。
<强>更新强>
hash = Hash.new()
hash["cats"] = 1
hash["blaks"] = 2
hash["Pogs"] = 13
hash["Dogs"] = 12
hash.max_by(2) { |_, v| v } # => [["Pogs", 13], ["Dogs", 12]]
hash.max_by(2) { |_, v| v }.map(&:first) # => ["Pogs", "Dogs"]
注意:#min
,#min_by
,#max
和#max_by
支持optional argument从 Ruby 2.2.0 返回多个元素起。
答案 1 :(得分:1)
试试这个
hash.max_by(2) { |k, v| [v, k] }.map(&:first)
答案 2 :(得分:0)
与往常一样,ruby中有多种处理方式。
hash
.sort_by { |_, value| value }
.collect { |key, _| key }
.last(2)
不一定比已经建议的好,但我喜欢它翻译成英语句子的方式,这样就很容易理解。