2012-07-27 10 views
20

Ich habe ein Array von Arrays:Wählen Sie alle Elemente aus einer Spalte in einem Array von Arrays in Ruby?

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

Und ich möchte eine nur die dritte Spalte von jedem der Arrays enthalten Array:

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

Wie würde ich das tun?

ich etwas will, wie geben:

arr[][2] 

Aber mehr Rubin wie denken, habe ich versucht:

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

aber dies gibt die ganze Reihe.

+1

Meinten Sie 'arr.collect {| r | r [2]} '? – waldrumpus

+0

Ihre 'select' Anweisung nimmt alle Zeilen, in denen das dritte Element truthig ist, deshalb erhalten Sie nicht das erwartete Ergebnis. –

Antwort

35

Sie wollen 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

Oder 'arr.map (&: dritte)' mit Rails/ActiveSupport. –

+1

auch '# first' und' # last' sind in plain ruby ​​verfügbar – akostadinov

1

Verwenden Karte oder sammeln arr.map {| a | a [2]}

+1

Es gibt keine Notwendigkeit für die 'each' vor' map'. –

13

Eine andere Methode:

arr.transpose[2] 
+0

Bei sehr großen Matrizen könnte "transpose" teurer sein als die 'map {| r | r [2]} Lösung? –

+0

@Jared Beck Memorywise würde ich ja sagen, teurer. – steenslag

+0

Danke, ich mag dieses eine sehr, da Sie es ohne einen Block verwenden können. Und wenn es notwendig wäre, auch in die erste und zweite Spalte zu gelangen, kann Transponieren verwendet werden, um die "transponierte" Matrix in einem Schritt einzurichten. – Ninjaxor

Verwandte Themen