Ruby: Quelle est la façon la plus simple de supprimer le premier élément d'un tableau?


257

Disons que j'ai un tableau

[0, 132, 432, 342, 234]

Quelle est la façon la plus simple de se débarrasser du premier élément? (0)


1
«shift» est pop et «unshift» est push. Dans quel décalage prend le nombre de paramètres à faire apparaître
Arun

Réponses:


287

"pop" le premier élément d'un tableau est appelé " shift " ("unshift" étant l'opération consistant à ajouter un élément devant le tableau).


11
Notez que cela mute le tableau et retourne nilsur un tableau vide. Voir droppour une alternative, comme mentionné dans l'autre réponse.
Jay

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

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

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

et en plus:

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

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

15
Meilleure réponse puisque (a) évalue le tableau coupé, et cela fonctionne comme prévu sur un tableau vide:[].drop(1) => []
fearless_fool

4
Aussi la meilleure réponse car OP a dit "quelle est la façon la plus simple de se débarrasser du premier élément"
notaceo

4
Cette réponse montre qu'il est recommandé de faire défiler vers le bas même si la première réponse et l'exception a déjà plus de 100 votes positifs. Je vous remercie.
maddin2code

7
+1 puisque cela retourne un tableau modifié, tandis que shiftmute le tableau en place et renvoie l'élément décalé (ou nilsi le tableau était vide)
yuval

305

Utilisez la shiftméthode sur le tableau

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

Si vous souhaitez supprimer n éléments de départ, vous pouvez utiliser x.shift(n)


3
l'explication doit être fusionnée dans la bonne réponse car le contenu est le même
Yolgie

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

Donc contrairement à shiftou slicecela retourne le tableau modifié (utile pour un liners).


12
Un piège à surveiller: si le tableau est vide, il renvoie nil: [][1..-1] => nilet non [].
Mohamad

2
N'est-ce pas [1,2,3].shiftun one-liner?
thekingoftruth

4
@thekingoftruth: oui, mais il évalue l'élément que vous avez jeté, pas le reste du tableau, donc il prend une autre ligne.
fearless_fool

4
J'aime cette réponse parce que c'est une expression d' une ligne que vous pouvez utiliser n'importe où. Pour éviter le problème [] vs nil, vous pouvez le faire arry[1..-1] || []. Mais arry.drop (1) est encore mieux.
fearless_fool

Je vais avec ce cuz c'est simple, comment obtiendriez-vous le "tableau moins ce qui a été déplacé", je ne vois pas comment cela fonctionnerait ... C'est la réponse principale mais cela ne semble pas répondre à la question puisque cette prochaine étape n'est pas évidente pour un débutant!
Louis Maddox

99

C'est assez soigné:

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

Comme indiqué dans les commentaires, il y a un avantage à ne pas muter la liste d'origine.


2
très intelligent et fonctionne parfaitement. Une fois que vous faites cela, vous aurez les deux variables "tête" et "queue" à votre disposition.
nfriend21

3
Cela me rappelle beaucoup de lisp. (let ((head (car mylist)) (tail (cdr mylist)) ...)
thekingoftruth

@ hurikhan77 Nice! Je voulais essayer. Savoir que Darcs est écrit en Haskell aide à piquer mon intérêt.
thekingoftruth

6
Cette version a également l'avantage de ne pas muter la liste d'origine
Paweł Obrok

2
utile lors de l'extraction d'informations sans étape supplémentaire header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
juliangonzalez




4

Vous pouvez utiliser la méthode Array.delete_at (0) qui supprimera le premier élément.

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

Je ne pense pas que ce unless x.empty?soit nécessaire. Il retourne simplement nilsi l'index est hors limites.
tknomad

2

Vous pouvez utiliser:

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

Les deux peuvent fonctionner


1

Vous pouvez utiliser:
arr - [arr[0]] ou bien arr - [arr.shift()] ou simplement arr.shift(1)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.