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)

NullVoxPopuli
źródło
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ą).

Sjoerd
źródło
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] 
przerażające
źródło
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)

bragboy
źródło
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).

imadło
źródło
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.

hurikhan77
źródło
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
18

lub a.delete_at 0

zzzhc
źródło
11

Możesz użyć:

a.slice!(0)

plasterek! uogólnia na dowolny indeks lub zakres.

Matthew Flaschen
źródło
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]
lalit.sethi143
źródło
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ć

sam
źródło
1

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

Avijit Majhi
źródło