Вычисление частоты слагаемых в многомерном массиве в Ruby - PullRequest
0 голосов
/ 09 апреля 2010

У меня есть массив: keys = [["a", "a", "b"], ["a", "b", "c"]] Мне нужно найти количество раз, когда «a», «b», «c» встречаются в каждом подмассиве «keys».

выводом может быть хеш: ["a" => [2,1], "b" => [1,1], "c" => [0,1]]

1 Ответ

4 голосов
/ 09 апреля 2010

Возможно, не самый быстрый, но, вероятно, один из самых коротких:

Hash[
  keys.flatten.uniq.map{|e|
    [e, keys.map{|ar| ar.count(e)}]
  }
]
=> {"a"=>[2, 1], "b"=>[1, 1], "c"=>[0, 1]}

или

keys.flatten.uniq.inject({}){|acc,e|
  acc.merge({e => keys.map{|ar| ar.count(e)}})
}

Вот выстрел в версии 1.8.6:

keys.flatten.uniq.inject({}){|acc,e|
  acc[e] = keys.map{|ar|
    ar.select{|c| c==e}.size
  }
  acc
}

Но тебе лучше получить этот драгоценный камень backports в ближайшее время ...;)

...