Рубі: Який найпростіший спосіб видалити перший елемент з масиву?


257

Скажімо, у мене є масив

[0, 132, 432, 342, 234]

Який найпростіший спосіб позбутися першого елемента? (0)


1
'shift' є попсовим, а 'unhift' - натисканням. У якому зсуві приймається кількість параметрів для поп
Арун

Відповіді:


287

"pop" перший елемент масиву називається " shift " ("невмилий" - це операція додавання одного елемента перед масивом).


11
Зауважте, що це вимкнення масиву та повернення nilна порожній масив. Шукайте dropальтернативу, про яку йдеться в іншій відповіді.
Джей

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

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

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

і додатково:

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

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

15
Найкраща відповідь, оскільки (а) оцінює обрізаний масив, і він працює, як очікувалося, на порожньому масиві:[].drop(1) => []
безстрашний_фол

4
Також найкраща відповідь, оскільки ОП сказав: "який найпростіший спосіб позбутися першого елемента"
notaceo

4
Ця відповідь свідчить про те, що рекомендується прокручувати вниз, навіть якщо перша та виключена відповідь має вже більше 100 відгуків. Дякую.
maddin2code

7
+1, оскільки це повертає модифікований масив, тоді як shiftмутує масив на місці та повертає зміщений елемент (або nilякщо масив був порожнім)
yuval

305

Використовуйте shiftметод на масиві

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

Якщо ви хочете видалити n початкових елементів, ви можете використовувати x.shift(n)


3
пояснення слід об'єднати у правильну відповідь, оскільки зміст той самий
Yolgie

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

Таким чином , в відміну від shiftабо sliceце повертає модифікований масив (корисно для лайнери).


12
Один повинен дивитися: якщо масив порожній, він повертає нуль: [][1..-1] => nilі ні [].
Мохамад

2
Це не [1,2,3].shiftоднолінійний?
thekingoftruth

4
@thekingoftruth: так, але він оцінює елемент, який ви викинули, а не решту масиву, тому він займає інший рядок.
безстрашний_фол

4
Мені подобається ця відповідь, тому що це однорядковий вираз, який ви можете використовувати будь-де. Щоб уникнути проблеми [] проти нуля, ви можете це зробити arry[1..-1] || []. Але arry.drop (1) ще краще.
безстрашний_фол

Я йду з цим, тому що це просто, як би ви отримали "масив мінус, що змістилося", я не бачу, як це буде працювати ... Це головна відповідь, але, схоже, це не відповідає питання, оскільки наступний крок не очевидний для новачків!
Луї Маддокс

99

Це досить акуратно:

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

Як написано в коментарях, є перевага в тому, щоб не мутувати початковий список.


2
дуже розумний, і працює чудово. Як тільки ви це зробите, у вашому розпорядженні будуть обидві змінні "голова" та "хвіст".
nfriend21

3
Це мені дуже нагадує. (let ((head (car mylist)) (tail (cdr mylist)) ...)
thekingoftruth

@ hurikhan77 Приємно! Я мав намір спробувати це. Знання того, що Darcs написано Haskell, допомагає викликати мій інтерес.
thekingoftruth

6
Ця версія також має перевагу в тому, що не мутує початковий список
Paweł Obrok

2
корисно при вилученні інформації без додаткового кроку header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
juliangonzalez




4

Ви можете використовувати метод Array.delete_at (0), який видалить перший елемент.

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

Я не вважаю unless x.empty?за потрібне. Він просто повертається, nilякщо індекс знаходиться поза діапазоном.
tknomad

2

Ви можете використовувати:

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

Обидва можуть працювати


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.