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)


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).


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] 

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)


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).


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.


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




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]

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


1

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.