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)


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


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] 

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)


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


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.


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




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]

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


1

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.