2014-10-27 4 views
0

Я вытаскиваю хэш из mashable.com, и мне нужно подсчитать экземпляры имен авторов (автор - это ключ, а значение - имя автора). mashable's apiПодсчет количества повторений значения в хэшировании

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

Я хочу итерацию по хэш и вытаскивать имя автора, а затем посчитать количество раз она повторяется в весь список от Mashable апи.

Вот что у меня есть; он превращает хэш в массив, итерации по нему, добавляя счет к каждому имени автора в качестве ключа, а затем добавляет количество повторов в качестве значения.

Это было бы здорово, но я не могу вернуть его в свой оригинальный хэш из 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 

Когда я бросаю код обратно в этой итерации, все это делает это итерация начального, и после каждой записи я получаю список всех авторов и количество написанных им историй, вместо того, чтобы перечислять каждого автора, связанного с другой информацией о каждой истории, и количеством написанных им историй.

Любая помощь очень ценится.

ответ

0

@ Michael Kohl Это был хороший ответ, я думаю, что задал вопрос неправильно. Я ликвидируюсь делать это:

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

внутри моей «all_stories» петля ...

да я уверен, что я пытался «закачка» значения в исходный хэш, и это было путь неправильно ...

спасибо за вашу помощь, хотя

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 элементов массива в хэш.

+0

бы мне нужно ввести значение, которое я сравниваю для каждого ключа, который я хотел сравнить? –

+0

@DavidJohnson Это ответ на ваш вопрос? –

+0

Я отвечаю –

Смежные вопросы