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)

NullVoxPopuli
la source
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).

Sjoerd
la source
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] 
effrayant
la source
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)

bragboy
la source
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).

vice
la source
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.

hurikhan77
la source
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
18

ou a.delete_at 0

zzzhc
la source
11

Vous pouvez utiliser:

a.slice!(0)

tranche! se généralise à n'importe quel index ou plage.

Matthew Flaschen
la source
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]
lalit.sethi143
la source
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

sam
la source
1

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

Avijit Majhi
la source