Ruby: Apa cara termudah untuk menghapus elemen pertama dari array?

257

Katakanlah saya punya array

[0, 132, 432, 342, 234]

Apa cara termudah untuk menyingkirkan elemen pertama? (0)

NullVoxPopuli
sumber
1
'shift' adalah pop dan 'unshift' adalah push. Di mana pergeseran mengambil dalam jumlah parameter ke pop
Arun

Jawaban:

287

"pop" ing elemen pertama Array disebut " shift " ("unshift" adalah operasi penambahan satu elemen di depan array).

Sjoerd
sumber
11
Catatan ini memutasi array dan mengembalikan nilarray kosong. Lihat dropalternatifnya, sebagaimana disebutkan dalam jawaban lainnya.
Jay
368
a = [0,1,2,3]

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

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

dan tambahan:

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

[0,1,2,3].drop(3)
=> [3] 
scaryguy
sumber
15
Jawaban terbaik karena (a) mengevaluasi ke array yang dipangkas, dan berfungsi seperti yang diharapkan pada array kosong:[].drop(1) => []
fearless_fool
4
Juga jawaban terbaik karena OP mengatakan "apa cara termudah untuk menyingkirkan elemen pertama"
notaceo
4
Jawaban ini menunjukkan bahwa disarankan untuk menggulir ke bawah bahkan jika jawaban pertama dan yang dikecualikan sudah lebih dari 100 suara naik. Terima kasih.
maddin2code
7
+1 karena ini mengembalikan larik yang dimodifikasi, sedangkan shiftmemutasikan larik di tempat dan mengembalikan elemen yang digeser (atau niljika larik kosong)
yuval
305

Gunakan shiftmetode pada array

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

Jika Anda ingin menghapus dan memulai elemen yang dapat Anda gunakan x.shift(n)

pembual
sumber
3
penjelasannya harus digabungkan menjadi jawaban yang benar karena isinya sama
Yolgie
129
[0, 132, 432, 342, 234][1..-1]
=> [132, 432, 342, 234]

Jadi tidak seperti ini shiftatau sliceini mengembalikan array yang dimodifikasi (berguna untuk satu liner).

ragum
sumber
12
Satu gotcha yang harus diperhatikan: jika array kosong mengembalikan nihil: [][1..-1] => nildan tidak [].
Mohamad
2
Bukankah [1,2,3].shiftsatu kalimat?
thekingoftruth
4
@thekingoftruth: ya, tetapi mengevaluasi elemen yang Anda buang, bukan sisa array, sehingga dibutuhkan baris lain.
fearless_fool
4
Saya suka jawaban ini karena ini adalah ekspresi satu baris yang dapat Anda gunakan di mana saja. Untuk menghindari masalah [] vs nol, Anda dapat melakukannya arry[1..-1] || []. Tapi arry.drop (1) bahkan lebih baik.
fearless_fool
Aku akan pergi dengan ini karena itu sederhana, bagaimana Anda mendapatkan "array minus apa yang digeser keluar", saya tidak bisa melihat bagaimana itu bekerja ... Ini adalah jawaban utama tetapi tampaknya tidak menjawab pertanyaan karena langkah selanjutnya ini tidak jelas bagi seorang pemula!
Louis Maddox
99

Ini cukup rapi:

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

Seperti yang tertulis di komentar, ada keuntungan tidak mengubah daftar asli.

hurikhan77
sumber
2
sangat pintar, dan bekerja dengan sempurna. Setelah Anda melakukan ini, Anda akan memiliki kedua variabel "head" dan "tail" yang Anda inginkan.
nfriend21
3
Ini mengingatkan saya banyak cadel. (let ((head (car mylist)) (tail (cdr mylist)) ...)
thekingoftruth
@ hurikhan77 Bagus! Saya bermaksud mencobanya. Mengetahui bahwa Darcs ditulis dalam Haskell membantu menyinggung minat saya.
thekingoftruth
6
Versi ini juga memiliki keuntungan tidak mengubah daftar asli
Paweł Obrok
2
berguna saat mengekstraksi info tanpa langkah tambahan header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
juliangonzalez
18

atau a.delete_at 0

zzzhc
sumber
11

Kamu bisa memakai:

a.slice!(0)

mengiris! digeneralisasikan ke indeks atau rentang apa pun.

Matthew Flaschen
sumber
4

Anda dapat menggunakan metode Array.delete_at (0) yang akan menghapus elemen pertama.

 x = [2,3,4,11,0]
 x.delete_at(0) unless x.empty? # [3,4,11,0]
lalit.sethi143
sumber
Saya pikir unless x.empty?itu tidak perlu. Ini hanya mengembalikan niljika indeks berada di luar jangkauan.
tknomad
2

Kamu bisa memakai:

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

Keduanya bisa bekerja

sam
sumber
1

Anda dapat menggunakan:
arr - [arr[0]] atau yang lain arr - [arr.shift()] atau hanya arr.shift(1)

Avijit Majhi
sumber