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.