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.