Tengo una matriz 2D ordenada de la siguiente manera:

a = [[1, 2011], [3, 1999], [4, 2014], [6, 1998], ...]

¿Cómo puedo transformar esto en un hash siendo la clave el año y el valor el número al frente?

{2011 => 1, 1999 => 3, 2014 => 4, 1998 => 6, ...}
1
Alan1 30 ene. 2016 a las 13:36

3 respuestas

La mejor respuesta
[[1, 2011], [3, 1999], [4, 2014], [6, 1998]].map(&:reverse).to_h
  # => {2011=>1, 1999=>3, 2014=>4, 1998=>6}

Para versiones anteriores de Ruby, puede usar:

Hash[a.map(&:reverse)]
3
ndnenkov 30 ene. 2016 a las 10:55

Aquí hay una manera más.

a.each.with_object({}) {|(v,k), h| h[k] = v}
0
Wand Maker 30 ene. 2016 a las 13:42

Aquí hay un par de otras formas que deberían ser compatibles con 1.8.7:

a = [[1, 2011], [3, 1999], [4, 2014], [6, 1998]]

v, y = a.transpose
Hash[y.zip(v)]
  #=> {2011=>1, 1999=>3, 2014=>4, 1998=>6}

a.reduce({}) { |h,(v,y)| h.update({ y=>v }) }
  #=> {2011=>1, 1999=>3, 2014=>4, 1998=>6}

Hash # update (también conocido como {{ X0}}) podría reemplazarse con Hash # merge.

1
Cary Swoveland 30 ene. 2016 a las 13:08