He aquí una versión de steenslag que funciona cuando las matrices no son del mismo tamaño:
size = h.values.max_by { |a| a.length }.length
m = h.values.map { |a| a += [nil] * (size - a.length) }.transpose.insert(0, h.keys)
nil
parece como un marcador de posición razonable para los valores que faltan, pero se puede, por Por supuesto, usa lo que tenga sentido.
Por ejemplo:
>> h = {:a => [1, 2, 3], :b => [4, 5, 6, 7, 8], :c => [9]}
>> size = h.values.max_by { |a| a.length }.length
>> m = h.values.map { |a| a += [nil] * (size - a.length) }.transpose.insert(0, h.keys)
=> [[:a, :b, :c], [1, 4, 9], [2, 5, nil], [3, 6, nil], [nil, 7, nil], [nil, 8, nil]]
>> m.each { |r| puts r.map { |x| x.nil?? '' : x }.inspect }
[:a, :b, :c]
[ 1, 4, 9]
[ 2, 5, ""]
[ 3, 6, ""]
["", 7, ""]
["", 8, ""]
Lo más rápido es un "bucle doble", pero sigue siendo una sola línea; es tan malo? –
IMO es demasiado especializado como para ser una característica integrada, y demasiado fácil de hacer "a mano" :) –
No estaría mal que alguien publique el sencillo delineador. :-) – Larsenal