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)

NullVoxPopuli
quelle
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).

Sjoerd
quelle
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] 
Scaryguy
quelle
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)

Prahler
quelle
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).

Schraubstock
quelle
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.

hurikhan77
quelle
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
18

oder a.delete_at 0

zzzhc
quelle
11

Sie können verwenden:

a.slice!(0)

Scheibe! verallgemeinert auf jeden Index oder Bereich.

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

Sam
quelle
1

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

Avijit Majhi
quelle