2010-11-12 16 views
5

Tengo el siguiente hash de rubí:Rubí Hash transponer

h = { i1: { q1: 1, q2:2 }, i2: { q1: 3, q2: 4} } 

y quiero la transposición de la siguiente manera:

{ q1: { i1: 1, i2: 3 }, q2: { i1: 2, i2: 4 } } 

Ahora, se le ocurrió una función que hace lo que yo quiero, pero me pregunto si hay una manera más sucinta/elegante para lo mismo?

Mi solución:

ht = Hash.new{ |h,k| h[k] = {} } 

h.each_pair do |k,ih| 
    ih.each_pair{ |ik, iv| ht[ik][k] = iv } 
end 
+0

Eso ya es muy sucinta. ¿Tienes un ejemplo del mundo real de cuándo quieres transformar el hash así? –

+0

Tengo básicamente la misma estructura de datos (solo más grande) con indicadores (i1, i2, ...) y sus valores en algunas fechas (q1, q2, q3, ....). Todavía no estoy seguro de que el clima deba usar aquí matriz bidimensional (en realidad todavía estoy evaluando ambas versiones ...) –

+0

Si haces este tipo de malabares a menudo, es posible que te resulte más fácil usar Sqlite. –

Respuesta

2

Si prefiere inject, se puede escribir como

h.inject({}){|a,(k,v)| 
    v.inject(a){|a1,(k1,v1)| 
    a1[k1] ||= {} 
    a1[k1][k] = v1 
    a1 
    } 
    a 
} 
+0

Sí, hace lo mismo, solo con inyectar, aunque creo que la primera forma de hacerlo es un poco más legible (en la función real tengo que incluir algunas líneas más de código como manejo de excepciones, etc.) –

+0

¿Ha usado una especie de biblioteca de minificación en este bloque de código? Se ve uglified :) – scaryguy

Cuestiones relacionadas