Ruby: Jak najłatwiej usunąć pierwszy element z tablicy?


257

Powiedzmy, że mam tablicę

[0, 132, 432, 342, 234]

Jak najłatwiej pozbyć się pierwszego elementu? (0)


1
„shift” to pop, a „unshift” to push. W którym przesunięcie przyjmuje liczbę parametrów do pop
— Arun

Odpowiedzi:


287

„wyskakiwanie” pierwszego elementu tablicy nazywa się „ shift ” („unshift” to operacja dodawania jednego elementu przed tablicą).


11
Zauważ, że to mutuje tablicę i zwraca nilpustą tablicę. Sprawdź dropalternatywę, jak wspomniano w drugiej odpowiedzi.
— Jay,

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

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

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

i dodatkowo:

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

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

15
Najlepsza odpowiedź, ponieważ (a) ocenia przyciętą tablicę i działa zgodnie z oczekiwaniami na pustej tablicy:[].drop(1) => []
— nieustraszony_głup

4
Również najlepsza odpowiedź, ponieważ OP powiedział „jaki jest najłatwiejszy sposób na pozbycie się pierwszego elementu”
— notaceo

4
Ta odpowiedź pokazuje, że zaleca się przewinięcie w dół, nawet jeśli pierwsza i wykluczona odpowiedź ma już ponad 100 głosów pozytywnych. Dziękuję Ci.
— maddin2code

7
+1, ponieważ zwraca zmodyfikowaną tablicę, podczas gdy shiftmutuje tablicę na miejscu i zwraca przesunięty element (lub niljeśli tablica była pusta)
— yuval 15.01.2016

305

Użyj shiftmetody z tablicy

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

Jeśli chcesz usunąć n elementów początkowych, których możesz użyć x.shift(n)


3
wyjaśnienie należy połączyć w poprawną odpowiedź, ponieważ treść jest taka sama
— Yolgie

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

W przeciwieństwie do tego shiftlub slicezwraca zmodyfikowaną tablicę (przydatne dla jednej linijki).


12
Trzeba uważać: jeśli tablica jest pusta, zwraca zero: [][1..-1] => nili nie [].
— Mohamad,

2
Czy to nie [1,2,3].shiftjest jedna linijka?
— thekingoftruth

4
@thekingoftruth: tak, ale ocenia element, który wyrzuciłeś, a nie resztę tablicy, więc przyjmuje inną linię.
— nieustraszony_pool

4
Podoba mi się ta odpowiedź, ponieważ jest to wyrażenie jednowierszowe , którego można używać w dowolnym miejscu. Aby uniknąć problemu [] vs zero, możesz to zrobić arry[1..-1] || []. Ale arry.drop (1) jest jeszcze lepszy.
— nieustraszony_pool

Idę z tym, bo to proste, jak uzyskasz „tablicę pomniejszoną o to, co zostało przesunięte”, nie widzę, jak to by działało ... To główna odpowiedź, ale wydaje się, że nie odpowiada pytanie, ponieważ ten następny krok nie jest oczywisty dla początkującego!
— Louis Maddox,

99

To całkiem fajne:

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

Jak napisano w komentarzach, zaletą nie jest mutowanie oryginalnej listy.


2
bardzo sprytny i działa doskonale. Gdy to zrobisz, będziesz mieć do dyspozycji obie zmienne „głowa” i „ogon”.
— nfriend21

3
To przypomina mi dużo seplenienia. (let ((head (car mylist)) (tail (cdr mylist)) ...)
— thekingoftruth

@ hurikhan77 Nice! Chciałem spróbować. Świadomość, że Darcs jest napisany w języku Haskell, wzbudza moje zainteresowanie.
— thekingoftruth

6
Ta wersja ma również tę zaletę, że nie
— mutuje

2
przydatne przy wydobywaniu informacji bez dodatkowego kroku header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
— juliangonzalez




4

Możesz użyć metody Array.delete_at (0), która usunie pierwszy element.

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

Nie uważam za unless x.empty?konieczne. Zwraca po prostu, niljeśli indeks jest poza zakresem.
— tknomad

2

Możesz użyć:

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

Oba mogą działać


1

Możesz użyć:
arr - [arr[0]] albo jeszcze arr - [arr.shift()] albo po prostu arr.shift(1)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.