2012-07-27 20 views
20

Ben diziler içeren bir dizi var:Ruby'deki bir dizi dizideki bir sütundan tüm öğeleri seçin.

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

Ve diziler her birinin sadece üçüncü sütun içeren bir dizi istiyorum:

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

Bunu nasıl yapardın?

ben gibi bir şey yazmak istediğiniz:

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

ama bu tüm satır döndürür:

arr[][2] 

Ama daha Yakut benzeri düşünerek, denedim. Bir | |

+1

Eğer 'arr.collect {ortalama mi | r | r [2]} '? – waldrumpus

+0

'select' ifadeniz, üçüncü öğenin doğru olduğu tüm satırları alır, bu nedenle beklenen sonucu alamazsınız. Rails/ActiveSupport ile –

cevap

35

Sen 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

veya 'arr.map (&: üçüncü)'. –

+1

ayrıca # first' ve '# last' düz ruby ​​içinde kullanılabilir – akostadinov

1

kullanın harita istiyorsanız veya arr.map {toplamak a [2]}

+1

' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' 'ye gerek yoktur. –

13

Başka bir yöntem:

arr.transpose[2] 
+0

Çok büyük matrisler için, 'transpoze' haritadan daha pahalı olabilirdi | r [2]} 'çözüm? –

+0

@Jared Beck Memorywise Evet, daha pahalı diyebilirim. – steenslag

+0

Teşekkürler, bunu bir bloğu kullanmadan kullanabilmen için çok beğendim. Ve eğer birinci ve ikinci sütuna da (benim yaptığım gibi) ulaşma ihtiyacı varsa, transpoze 'dönüştürülmüş' matrisi bir adımda ayarlamak için kullanılabilir. – Ninjaxor

İlgili konular