Just move things around a bit and you'll notice you've already got the behavior you want (or pretty close): irb(main):001:0> arr = [0,1,2,3,4] => [0, 1, 2, 3, 4] irb(main):002:0> [0..-2, -1].map{|i| arr[i]} => [[0, 1, 2, 3], 4] irb(main):003:0> [0, 2..3, 4..-1].map{|i| arr[i]} => [0, [2, 3], [4]] So just put the list of group selectors first, execute a map/collect on it and access the original array slices you want. Aaron out.