2012-07-27 19 views
20

Tengo una matriz de matrices:¿Seleccionar todos los elementos de una columna en una matriz de matrices en Ruby?

arr = [["Foo1", "Bar1", "1", "W"], 
["Foo2", "Bar2", "2", "X"], 
["Foo3", "Bar3", "3", "Y"], 
["Foo4", "Bar4", "4", "Z"]] 

Y quiero una matriz que contiene sólo la tercera columna de cada una de las matrices:

res = ["1", "2", "3", "4"] 

¿Cómo iba a hacer eso?

Quiero escribir algo como:

arr[][2] 

Pero pensando más Rubí-como, he intentado:

arr.select{ |r| r[2] } 

pero esto devuelve toda la fila.

+1

Quizás quiso decir 'arr.collect {| r | r [2]} '? – waldrumpus

+0

Su instrucción 'select' toma todas las filas donde el tercer elemento es verdad, es por eso que no obtiene el resultado esperado. –

Respuesta

35

¿Quieres arr.map {|row| row[2]}

arr = [["Foo1", "Bar1", "1", "W"], 
["Foo2", "Bar2", "2", "X"], 
["Foo3", "Bar3", "3", "Y"], 
["Foo4", "Bar4", "4", "Z"]] 

arr.map {|row| row[2]} 
# => ["1", "2", "3", "4"] 
+7

O 'arr.map (&: third)' con Rails/ActiveSupport. –

+1

también '# first' y' # last' están disponibles en ruby ​​simple – akostadinov

1

Uso mapa o recoger arr.map {| a | a [2]}

+1

No hay necesidad de 'cada' antes de' map'. –

13

Otro método:

arr.transpose[2] 
+0

Para matrices muy grandes, podría 'transponer' ser más costoso que el' mapa {| r | r [2]} 'solución? –

+0

@Jared Beck Memorywise Diría que sí, más caro. – steenslag

+0

Gracias, me gusta mucho, ya que puedes usarlo sin bloque. Y si también era necesario llegar a la primera y a la segunda columna (como yo lo hago), la transposición puede usarse para configurar la matriz 'transpuesta', todo en un solo paso. – Ninjaxor

Cuestiones relacionadas