Самый короткий способ получить именно то, что вы просите, и я могу придумать:
a = [[100, "one"],
[101, "one"],
[102, "one"],
[103, "two"],
[104, "three"],
[105, "three"]]
b = a.group_by(&:pop)
#=> {"three"=>[[104], [105]], "two"=>[[103]], "one"=>[[100], [101], [102]]}
, что, вероятно, то, что вы хотите.
обратите внимание, что a
получаетразрушенный этим
a
#=> [[100], [101], [102], [103], [104], [105]]
, если вас это беспокоит, вы можете написать
b = a.map(&:dup).group_by &:pop
.
И если вы действительно хотите этот формат, который вы написали, вы можете добавитьдругая карта:
b.map{|h,k| [h => k]}
#=> [{"one" => [100,101,102]}, {"two" => [103]}, {"three" => [104,105]}]
Итак, подведем итог:
[[100, "one"],
[101, "one"],
[102, "one"],
[103, "two"],
[104, "three"],
[105, "three"]].group_by(&:pop).map{ |h,k| [h => k] }