Ruby: Bir dizideki ilk öğeyi kaldırmanın en kolay yolu nedir?


257

Diyelim ki bir dizim var

[0, 132, 432, 342, 234]

İlk elementten kurtulmanın en kolay yolu nedir? (0)


1
'shift' pop ve 'unshift' itilir. Hangi vardiyada parametre sayısını alır
Arun

Yanıtlar:


287

Bir Dizinin ilk elemanına "pop" denir " shift " ("unshift", dizinin önüne bir öğe ekleme işlemidir).


11
Bunun diziyi değiştirdiğini ve nilboş bir diziye döndüğünü unutmayın . dropDiğer cevapta belirtildiği gibi bir alternatif için bakınız .
Jay

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

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

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

ve ek olarak:

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

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

15
En iyi cevap (a) kesilen diziyi değerlendirir ve boş bir dizide beklendiği gibi çalışır:[].drop(1) => []
fearless_fool

4
Ayrıca en iyi cevap çünkü OP "ilk elementten kurtulmanın en kolay yolu nedir" dedi
notaceo

4
Bu cevap, ilk ve istisna cevap 100'den fazla oy almasına rağmen aşağı kaydırmanın önerildiğini göstermektedir. Teşekkür ederim.
maddin2code

7
Bu, değiştirilmiş bir diziyi döndürdüğü için +1 shift, diziyi yerinde değiştirir ve kaydırılan öğeyi döndürür (veya nildizi boşsa)
yuval

305

Dizideki shiftyöntemi kullanma

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

N başlangıç ​​elemanını kaldırmak istiyorsanız kullanabilirsiniz x.shift(n)


3
içerik aynı olduğu için açıklama doğru cevapla birleştirilmelidir
Yolgie

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

Yani aksine shiftveya slicebu değiştirilmiş dizi döndürür (bir gömlek için yararlı).


12
Bir yakaladım için dikkat etmek: dizi boşaltmak ise nil döndürür: [][1..-1] => nildeğil [].
Mohamad

2
Is not [1,2,3].shifttek liner?
thekingoftruth

4
@thekingoftruth: evet, ancak dizinin geri kalanını değil, attığınız öğeyi değerlendirir, bu yüzden başka bir satır alır.
fearless_fool

4
Bu yanıtı seviyorum, çünkü her yerde kullanabileceğiniz tek satırlık bir ifade . [] Vs nil sorununu önlemek için bunu yapabilirsiniz arry[1..-1] || []. Ancak arry.drop (1) daha da iyidir.
fearless_fool

Bu cuz ile gidiyorum basit, nasıl "dizi değiştirildi ne eksi" olsun, nasıl çalıştığını göremiyorum ... Bu ana cevap ama cevap gibi görünmüyor Bir sonraki adım bir acemi için açık değil çünkü soru!
Louis Maddox

99

Bu oldukça düzgün:

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

Yorumlarda yazıldığı gibi, orijinal listeyi değiştirmeme avantajı vardır.


2
çok zeki ve mükemmel çalışıyor. Bunu yaptıktan sonra, emrinizde "head" ve "tail" değişkenlerinin ikisine birden sahip olacaksınız.
nfriend21

3
Bu bana çok fazla lisp hatırlatıyor. (let ((head (car mylist)) (tail (cdr mylist)) ...)
thekingoftruth

@ hurikhan77 Güzel! Denemek için anlam ifade ettim. Darcs'in Haskell'de yazıldığını bilmek ilgimi çekmeye yardımcı olur.
thekingoftruth

6
Bu sürüm aynı zamanda orijinal listeyi değiştirmeme avantajına sahiptir
Paweł Obrok

2
ek bir adım olmadan bilgi ayıklanırken yararlı header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
juliangonzalez




4

İlk öğeyi silecek Array.delete_at (0) yöntemini kullanabilirsiniz.

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

Bence unless x.empty?gerekli değil . nilİndeks aralık dışındaysa geri döner .
tknomad

2

Kullanabilirsiniz:

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

Her ikisi de çalışabilir


1

Kullanabilirsiniz:
arr - [arr[0]] veya başka arr - [arr.shift()] veya basitçe arr.shift(1)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.