2013-11-21 2 views
1

Мой массиврубин group_by в массиве массивов

fruits = [["apple", "Tue"], ["mango", "Mon"], ["apple", "Wed"], ["orange", "Tue"]] 

Результат я хочу, чтобы это группа по фруктам и количество

[["apple", 2], ["mango", 1], ["orange", 1]] 

Я всегда работал только с одной массива, Я хотел сгруппировать элементы, как работать с массивом массивов?

ответ

2
fruits.group_by {|(fruit, day)| fruit }.map {|fruit, match| [fruit, match.count] } 
+0

Если кто-либо ищет прямую документацию: http://ruby-doc.org/core-2.3.3/Enumerable.html#method-i-group_by – user2490003

3
fruits = [["apple", "Tue"], ["mango", "Mon"], ["apple", "Wed"], ["orange", "Tue"]] 
fruits.group_by(&:first).map{|k,v| [k,v.size]} 
# => [["apple", 2], ["mango", 1], ["orange", 1]] 
2

Ваш пример формат выглядит как хэш. Если это нормально, то вы можете сделать это.

count = Hash.new(0) 
fruits.each { |f| count[f.first] += 1 } 
# => {"apple"=>2, "mango"=>1, "orange"=>1} 

Тогда вы можете просто преобразовать его в массив.

count.to_a 
# => [["apple", 2], ["mango", 1], ["orange", 1]] 

EDIT

В качестве примечания, определения хэш как Hash.new(0) означает, что значение по умолчанию 0 вместо nil. Это то, как мы уходим, не определяя ни одного из хэш-ключей в первую очередь.

EDIT 2

С предложением Arup в этом превращается в

counts = fruits.each_with_object(Hash.new(0)) { |f, h| h[f.first] += 1 } 

В зависимости от ваших предпочтений. Я считаю, что первое немного легче читать.

+2

Как вы используете свой код, я бы предложил перейдите в 'each_with_object'. –

+0

или 'fruits.reduce (Hash.new (0)) {| count, f | count [f.first] + = 1; рассчитывать} .to_a'. –

+0

Не любите 'Hash.new (0)'! Это похоже на лучшую рубинскую вещь, которую я нашел в этом месяце. – screenmutt

0

Будучи опоздавшим на вечеринку, я нахожу, что закуски почти ушли. Увы, я остался только с крошкой:

f = fruits.map(&:first).sort 
f.uniq.zip(f.chunk(&:dup).map(&:size)) # => [["apple", 2], ["mango", 2], ["orange", 2]] 
    # => [["apple", 2], ["mango", 2], ["orange", 2]] 

Если бы я был более пунктуален, я бы взял один из этих вкусных пирогов group_by.

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