2009-03-29 15 views

Respuesta

117

Sí, Ruby tiene una sintaxis de corte de matriz muy similar a Python. Aquí está la documentación ri para el método de índice de matriz:

--------------------------------------------------------------- Array#[] 
    array[index]    -> obj  or nil 
    array[start, length]  -> an_array or nil 
    array[range]    -> an_array or nil 
    array.slice(index)   -> obj  or nil 
    array.slice(start, length) -> an_array or nil 
    array.slice(range)   -> an_array or nil 
------------------------------------------------------------------------ 
    Element Reference---Returns the element at index, or returns a 
    subarray starting at start and continuing for length elements, or 
    returns a subarray specified by range. Negative indices count 
    backward from the end of the array (-1 is the last element). 
    Returns nil if the index (or starting index) are out of range. 

     a = [ "a", "b", "c", "d", "e" ] 
     a[2] + a[0] + a[1] #=> "cab" 
     a[6]     #=> nil 
     a[1, 2]    #=> [ "b", "c" ] 
     a[1..3]    #=> [ "b", "c", "d" ] 
     a[4..7]    #=> [ "e" ] 
     a[6..10]    #=> nil 
     a[-3, 3]    #=> [ "c", "d", "e" ] 
     # special cases 
     a[5]     #=> nil 
     a[5, 1]    #=> [] 
     a[5..10]    #=> [] 
+5

¿por qué un [5, 1] ​​es diferente de un [6, 1]? – dertoni

+3

@dertoni: http://stackoverflow.com/questions/3219229/why-does-array-slice-behave-differently-for-length-n – michelpm

+8

'a [2 ..- 1]' para obtener del tercer elemento hasta el último 'a [2 ...- 1]' para pasar del tercer elemento al último último elemento. –

15

Se puede utilizar para este slice():

>> foo = [1,2,3,4,5,6] 
=> [1, 2, 3, 4, 5, 6] 
>> bar = [10,20,30,40,50,60] 
=> [10, 20, 30, 40, 50, 60] 
>> half = foo.length/2 
=> 3 
>> foobar = foo.slice(0, half) + bar.slice(half, foo.length) 
=> [1, 2, 3, 40, 50, 60] 

Por cierto, a lo mejor de mi conocimiento, Python "listas" son implementadas de manera eficiente las matrices de crecimiento dinámico. La inserción al comienzo está en O (n), la inserción al final se amortiza O (1), el acceso aleatorio es O (1).

+0

¿Quiere usar la matriz de barras en la segunda porción? – Samuel

+0

Sí, gracias. Arreglé esto. – Manuel

+0

FYI: 'slice!()' No modifica la matriz en su lugar, sino que "elimina los elementos proporcionados por un índice (opcionalmente hasta elementos de longitud) o por un rango". por http://ruby-doc.org/core-2.2.3/Array.html#method-i-slice-21 –

-5

También puede escribir algo como esto

foo = [1,2,3,4,5,6,7] 
bar = [10,20,30,40,50,60,70] 
half = foo.length/2 
foobar = (foo.first half) + (bar.drop half) 

=> [1, 2, 3, 40, 50, 60, 70] 
+1

Pierdes el objeto del medio en caso de que las matrices tengan un tamaño impar. –

+0

mi único punto fue mostrar que es posible cortar el primer y último método de llamadas – shabunc

+2

La referencia de código potencialmente insegura de @ michael-kohl es importante. Revise para que alguien no use este código como está y pierda un caso de aparición de 0.5. -1 – ghayes

18

Si desea dividir/cortar la matriz en un índice i,

arr = arr.drop(i) 

> arr = [1,2,3,4,5] 
=> [1, 2, 3, 4, 5] 
> arr.drop(2) 
=> [3, 4, 5] 
5

Otra forma es utilizar el método de rango

foo = [1,2,3,4,5,6] 
bar = [10,20,30,40,50,60] 
a = foo[0...3] 
b = bar[3...6] 

print a + b 
=> [1, 2, 3, 40, 50 , 60] 
Cuestiones relacionadas