Ruby: Qual è il modo più semplice per rimuovere il primo elemento da un array?


257

Diciamo che ho un array

[0, 132, 432, 342, 234]

Qual è il modo più semplice per sbarazzarsi del primo elemento? (0)


1
'shift' è pop e 'unshift' è push. In quale turno viene inserito il numero di parametri da visualizzare
Arun,

Risposte:


287

"pop" nel primo elemento di un array è chiamato " shift " ("unshift" è l'operazione di aggiunta di un elemento davanti all'array).


11
Nota che questo muta l'array e ritorna nilsu un array vuoto. Vedi dropun'alternativa, come menzionato nell'altra risposta.
Jay,

368
a = [0,1,2,3]

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

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

e inoltre:

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

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

15
La migliore risposta poiché (a) restituisce l'array tagliato e funziona come previsto su un array vuoto:[].drop(1) => []
fearless_fool

4
Anche la migliore risposta perché OP ha detto "qual è il modo più semplice per sbarazzarsi del primo elemento"
notaceo

4
Questa risposta mostra che è consigliabile scorrere verso il basso anche se la prima risposta esclusa ha già più di 100 voti. Grazie.
codice maddin2,

7
+1 poiché restituisce una matrice modificata, mentre shiftmuta la matrice in posizione e restituisce l'elemento spostato (o nilse la matrice era vuota)
yuval

305

Utilizzare il shiftmetodo sull'array

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

Se si desidera rimuovere n elementi di partenza, è possibile utilizzare x.shift(n)


3
la spiegazione dovrebbe essere unita alla risposta corretta poiché il contenuto è lo stesso
Yolgie,

129
[0, 132, 432, 342, 234][1..-1]
=> [132, 432, 342, 234]

Quindi, diversamente shifto slicerestituisce l'array modificato (utile per una riga).


12
Un aspetto da tenere d'occhio: se l'array è vuoto, restituisce zero: [][1..-1] => nile non [].
Mohamad,

2
Non è [1,2,3].shiftun one-liner?
thekingoftruth

4
@thekingoftruth: sì, ma valuta l'elemento che hai gettato via, non il resto dell'array, quindi prende un'altra riga.
fearless_fool

4
Mi piace questa risposta perché è un'espressione di una riga che puoi usare ovunque. Per evitare il problema [] vs zero, puoi farlo arry[1..-1] || []. Ma arry.drop (1) è ancora meglio.
fearless_fool

Vado con questo perché è semplice, come otterresti "array meno quello che è stato spostato", non riesco a vedere come funzionerebbe ... È la risposta principale ma non sembra rispondere al domanda poiché questo passaggio successivo non è ovvio per un principiante!
Louis Maddox,

99

Questo è abbastanza pulito:

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

Come scritto nei commenti, c'è il vantaggio di non mutare l'elenco originale.


2
molto intelligente e funziona perfettamente. Una volta fatto questo, avrai entrambe le variabili "testa" e "coda" a tua disposizione.
nfriend21,

3
Questo mi ricorda molto lisp. (let ((head (car mylist)) (tail (cdr mylist)) ...)
thekingoftruth,

@ hurikhan77 Nice! Volevo provarlo. Sapere che Darcs è scritto in Haskell aiuta a suscitare il mio interesse.
thekingoftruth,

6
Questa versione ha anche il vantaggio di non mutare la lista originale
Paweł Obrok

2
utile quando si estraggono informazioni senza un passaggio adizionale header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
juliangonzalez,




4

È possibile utilizzare il metodo Array.delete_at (0) che eliminerà il primo elemento.

 x = [2,3,4,11,0]
 x.delete_at(0) unless x.empty? # [3,4,11,0]

Non penso unless x.empty?sia necessario. Restituisce semplicemente nilse l'indice non è compreso nell'intervallo.
tknomad,

2

Puoi usare:

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

Entrambi possono funzionare


1

Puoi usare:
arr - [arr[0]] oppure arr - [arr.shift()] oppure semplicemente arr.shift(1)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.