Ruby: Was ist der einfachste Weg, um das erste Element aus einem Array zu entfernen?


257

Nehmen wir an, ich habe ein Array

[0, 132, 432, 342, 234]

Was ist der einfachste Weg, um das erste Element loszuwerden? (0)


1
'Shift' ist Pop und 'Unshift' ist Push. In welcher Verschiebung nimmt die Anzahl der Parameter zu Pop
Arun

Antworten:


287

Das "Pop" des ersten Elements eines Arrays wird als " Shift " bezeichnet ("Unshift" ist die Operation zum Hinzufügen eines Elements vor dem Array).


11
Beachten Sie, dass dies das Array mutiert und nilzu einem leeren Array zurückkehrt. Suchen Sie dropnach einer Alternative, wie in der anderen Antwort erwähnt.
Jay

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

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

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

und zusätzlich:

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

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

15
Beste Antwort, da (a) das zugeschnittene Array auswertet und es wie erwartet auf einem leeren Array funktioniert:[].drop(1) => []
furchtloser_fool

4
Auch die beste Antwort, weil OP sagte "Was ist der einfachste Weg, um das erste Element loszuwerden"
Notaceo

4
Diese Antwort zeigt, dass es empfehlenswert ist, nach unten zu scrollen, auch wenn die erste und ausgenommene Antwort bereits mehr als 100 positive Stimmen enthält. Danke dir.
maddin2code

7
+1, da dies ein modifiziertes Array zurückgibt, während shiftdas Array an Ort und Stelle mutiert und das verschobene Element (oder nilwenn das Array leer war) zurückgegeben wird
yuval

305

Verwenden Sie die shiftMethode für das Array

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

Wenn Sie n Startelemente entfernen möchten, können Sie verwenden x.shift(n)


3
Die Erklärung sollte in die richtige Antwort
eingefügt werden,

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

Anders als shiftoder slicedies gibt das modifizierte Array zurück (nützlich für einen Liner).


12
Ein Punkt, auf den Sie achten müssen: Wenn das Array leer ist, wird nil zurückgegeben: [][1..-1] => nilund nicht [].
Mohamad

2
Ist nicht [1,2,3].shiftein Einzeiler?
thekingoftruth

4
@thekingoftruth: Ja, aber es wird das Element ausgewertet, das Sie weggeworfen haben, nicht der Rest des Arrays, sodass eine weitere Zeile benötigt wird.
fearless_fool

4
Ich mag diese Antwort, weil es ein einzeiliger Ausdruck ist , den Sie überall verwenden können. Um das Problem [] vs nil zu vermeiden, können Sie dies tun arry[1..-1] || []. Aber arry.drop (1) ist noch besser.
fearless_fool

Ich gehe mit diesem, weil es einfach ist, wie würden Sie das "Array minus was verschoben wurde" bekommen, ich kann nicht sehen, wie das funktionieren würde ... Es ist die Hauptantwort, aber es scheint nicht die zu beantworten Frage, da dieser nächste Schritt für einen Neuling nicht offensichtlich ist!
Louis Maddox

99

Das ist ziemlich ordentlich:

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

Wie in den Kommentaren geschrieben, besteht der Vorteil darin, die ursprüngliche Liste nicht zu mutieren.


2
sehr klug und funktioniert perfekt. Sobald Sie dies tun, stehen Ihnen beide Variablen "head" und "tail" zur Verfügung.
nfriend21

3
Das erinnert mich sehr an Lispeln. (let ((head (car mylist)) (tail (cdr mylist)) ...)
Thekingoftruth

@ hurikhan77 Schön! Ich wollte es versuchen. Zu wissen, dass Darcs in Haskell geschrieben ist, weckt mein Interesse.
thekingoftruth

6
Diese Version hat auch den Vorteil, dass die ursprüngliche Liste nicht mutiert wird
Paweł Obrok

2
nützlich beim Extrahieren von Informationen ohne zusätzlichen Schritt header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
Juliangonzalez




4

Sie können die Methode Array.delete_at (0) verwenden, mit der das erste Element gelöscht wird.

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

Ich denke nicht, dass unless x.empty?es notwendig ist. Es wird einfach zurückgegeben, nilwenn der Index außerhalb des Bereichs liegt.
Knomad

2

Sie können verwenden:

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

Beides kann funktionieren


1

Sie können verwenden:
arr - [arr[0]] oder sonst arr - [arr.shift()] oder einfach arr.shift(1)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.