Ruby:配列から最初の要素を削除する最も簡単な方法は何ですか?


257

配列があるとしましょう

[0, 132, 432, 342, 234]

最初の要素を取り除く最も簡単な方法は何ですか?(0)


1
「shift」はポップで、「unshift」はプッシュです。どのシフトがポップするパラメーターの数を取り込むか
アルン

回答:


287

配列の最初の要素を「ポップ」することは「シフト」と呼ばれます(「シフト解除」は配列の前に1つの要素を追加する操作です)。


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) => []
fearless_fool

4
OPが「最初の要素を取り除く最も簡単な方法は何か」と言ったため、最良の答えも
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これは修正された配列(1つのライナーに便利)を返します。


12
注意が必要なのは、配列が空の場合はnil:[][1..-1] => nilを返し、notを返すこと[]です。
モハマド2013

2
[1,2,3].shiftワンライナーではありませんか?
thekingoftruth 2013年

4
@thekingoftruth:はい、ただし、配列の残りの部分ではなく、破棄した要素に評価されるため、別の行が使用されます。
fearless_fool

4
どこでも使える一行式なのでこの答えが好きです。[]対nilの問題を回避するには、を実行しますarry[1..-1] || []。しかし、arry.drop(1)はさらに優れています。
fearless_fool

私はこのcuzを使うのは簡単です。「配列からシフトアウトされたものを差し引いたもの」をどのように取得しますか?それがどのように機能するかはわかりません...それは主な答えですが、それは答えていないようですこの次のステップは初心者には明らかではないので、質問!
Louis Maddox

99

これはかなりきちんとしています:

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

コメントに書かれているように、元のリストを変更しないという利点があります。


2
非常に賢く、完璧に動作します。これを実行すると、「head」と「tail」の両方の変数を自由に使えるようになります。
nfriend21 2013

3
これは私に多くの軽快を思い出させます。(let ((head (car mylist)) (tail (cdr mylist)) ...)
thekingoftruth 2013年

@ hurikhan77いいね!私はそれを試してみるつもりでした。DarcsがHaskellで書かれていることを知ることは、私の興味をそそります。
thekingoftruth 2013年

6
このバージョンはまた、元のリストを変異しないという利点がある
パヴェル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

どちらも機能します


1

あなたが使用することができます:
arr - [arr[0]] またはそれ以外の arr - [arr.shift()] 場合または単に arr.shift(1)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.