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.