计算在哈希中重复值的次数

时间:2014-10-27 05:13:48

标签: ruby counting hash

我从mashable.com中提取哈希值,我需要计算作者姓名的实例(作者是关键,值是作者姓名)。 mashable's api

{
new: [
{   
    other_keys: 'other_values'...
    author: 'Author's Name'
}
]

我想迭代哈希并提取作者的名字,然后从mashable api中计算整个列表中重复的次数。

这就是我所拥有的;它将散列转换为数组,迭代它,将计数添加到每个作者名称作为键,然后将重复次数作为值添加。

这会很棒,但是我无法从mashable中将它恢复到我的原始哈希值,以添加我想要显示的所有其他哈希项。

all_authors = []

all_stories.each do |story|
    authors = story['author']
    all_authors << authors
end

counts = Hash.new(0)

all_authors.each do |name|
    counts[name] += 1
end

counts.each do |key, val|
    puts "#{key}: " "#{val}"
end

这样做应该是什么,但我试着把它放回到mashable的原始哈希:

   all_stories.each do |com|
    plorf = com['comments_count'].to_i
    if plorf < 1
        all_stories.each do |story|
            puts "Title:\n"
            puts story['title']
            puts "URL:\n"
            puts story['short_url']
            puts "Total Shares:\n"
            puts story['shares']['total']
        end
    end
   end

当我把代码放回到那个迭代中时,它所做的只是初始化的迭代,并且在每个条目之后,我得到所有作者的列表和他们编写的故事的数量,而不是列出每个作者连接到每个故事的其他信息和他们写的故事的数量。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

这是一个简化版本:

h = { a: 1, b: 2, c: 1, d: 1 }
h.count { |_, v| v == 1 } #=> 3
h.values.count(1)         #=> 3

或者,您也可以按键分组,然后计算:

 h.group_by(&:last).map { |v, a| [v, a.count] }.to_h #=> {1=>3, 2=>1}

这将散列按其值进行分组,计算键/值对数组中的次元素。这是一个更明确的版本:

  grouped = h.group_by(&:last) #=> {1=>[[:a, 1], [:c, 1], [:d, 1]], 2=>[[:b, 2]]}
  grouped.map { |v, a| [v, a.count] #=> [[1, 3], [2, 1]]

然后最后的to_h将2个元素数组的数组转换为哈希值。

答案 1 :(得分:0)

@Michael Kohl这是一个很好的答案,我想我的问题是错的。我结束了这样做:

author = story['author']
puts "Number of stories by #{story['author']}: #{author_count['author']}"

在我的“all_stories”循环中......

是的,我很确定我试图将值重新“注入”原始哈希值,这是错误的...

非常感谢你的帮助