Ruby: ¿Cuál es la forma más fácil de eliminar el primer elemento de una matriz?

257

Digamos que tengo una matriz

[0, 132, 432, 342, 234]

¿Cuál es la forma más fácil de deshacerse del primer elemento? (0)

NullVoxPopuli
fuente
1
'shift' es pop y 'unshift' es push. En qué turno toma la cantidad de parámetros que deben aparecer
Arun,

Respuestas:

287

"hacer estallar" el primer elemento de una matriz se llama " shift " ("unshift" es la operación de agregar un elemento delante de la matriz).

Sjoerd
fuente
11
Tenga en cuenta que esto muta la matriz y regresa nilen una matriz vacía. Vea dropuna alternativa, como se menciona en la otra respuesta.
Jay
368
a = [0,1,2,3]

a.drop(1)
# => [1, 2, 3] 

a
# => [0,1,2,3]

y adicionalmente:

[0,1,2,3].drop(2)
=> [2, 3]

[0,1,2,3].drop(3)
=> [3] 
miedo
fuente
15
La mejor respuesta desde (a) evalúa la matriz recortada, y funciona como se esperaba en una matriz vacía:[].drop(1) => []
fearless_fool
44
También la mejor respuesta porque OP dijo "cuál es la forma más fácil de deshacerse del primer elemento"
notaceo
44
Esta respuesta muestra que es recomendable desplazarse hacia abajo incluso si la primera y la respuesta exceptuada ya tiene más de 100 votos a favor. Gracias.
maddin2code
77
+1 ya que esto devuelve una matriz modificada, mientras que shiftmuta la matriz en su lugar y devuelve el elemento desplazado (o nilsi la matriz estaba vacía)
yuval
305

Usa el shiftmétodo en la matriz

>> x = [4,5,6]
=> [4, 5, 6]                                                            
>> x.shift 
=> 4
>> x                                                                    
=> [5, 6] 

Si desea eliminar n elementos iniciales, puede usar x.shift(n)

fanfarrón
fuente
3
la explicación debe combinarse con la respuesta correcta ya que el contenido es el mismo
Yolgie
129
[0, 132, 432, 342, 234][1..-1]
=> [132, 432, 342, 234]

Así que a diferencia shifto sliceEsto devuelve la matriz modificada (útil para trazadores de líneas uno).

tornillo
fuente
12
Hay que tener cuidado: si la matriz está vacía, devuelve nil: [][1..-1] => nily no [].
Mohamad
2
¿No es [1,2,3].shiftuna frase?
thekingoftruth
44
@thekingoftruth: sí, pero evalúa el elemento que arrojó, no el resto de la matriz, por lo que toma otra línea.
fearless_fool
44
Me gusta esta respuesta porque es una expresión de una línea que puedes usar en cualquier lugar. Para evitar el problema [] vs nulo, puede hacerlo arry[1..-1] || []. Pero arry.drop (1) es aún mejor.
fearless_fool
Voy con esto porque es simple, ¿cómo obtendrías la "matriz menos lo que se cambió", no puedo ver cómo funcionaría ... Es la respuesta principal, pero no parece responder a la pregunta ya que este próximo paso no es obvio para un novato!
Louis Maddox
99

Esto es bastante bueno:

head, *tail = [1, 2, 3, 4, 5]
#==> head = 1, tail = [2, 3, 4, 5]

Como está escrito en los comentarios, hay una ventaja de no mutar la lista original.

hurikhan77
fuente
2
Muy inteligente, y funciona perfectamente. Una vez que haga esto, tendrá las dos variables "cabeza" y "cola" a su disposición.
nfriend21
3
Esto me recuerda mucho ceceo. (let ((head (car mylist)) (tail (cdr mylist)) ...)
thekingoftruth
@ hurikhan77 ¡Bien! He tenido la intención de intentarlo. Saber que Darcs está escrito en Haskell ayuda a despertar mi interés.
thekingoftruth
66
Esta versión también tiene la ventaja de no mutar la lista original
Paweł Obrok
2
útil al extraer información sin un paso adicional header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
juliangonzalez
18

o a.delete_at 0

zzzhc
fuente
11

Puedes usar:

a.slice!(0)

¡rebanada! generaliza a cualquier índice o rango.

Matthew Flaschen
fuente
4

Puede usar el método Array.delete_at (0) que eliminará el primer elemento.

 x = [2,3,4,11,0]
 x.delete_at(0) unless x.empty? # [3,4,11,0]
lalit.sethi143
fuente
No creo que unless x.empty?sea ​​necesario. Simplemente regresa nilsi el índice está fuera de rango.
tknomad
2

Puedes usar:

 a.delete(a[0])   
 a.delete_at 0

Ambos pueden funcionar

sam
fuente
1

Puede usar:
arr - [arr[0]] o bien arr - [arr.shift()] o simplemente arr.shift(1)

Avijit Majhi
fuente