Ruby:从数组中删除第一个元素的最简单方法是什么?


257

可以说我有一个数组

[0, 132, 432, 342, 234]

摆脱第一个元素的最简单方法是什么?(0)


1
弹出“ shift”,按下“ unshift”。在哪个转变中需要弹出的参数数量
阿伦(Arun)

Answers:


287

“弹出”数组的第一个元素称为“ shift ”(“ unshift”是在数组前面添加一个元素的操作)。


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
最佳答案,因为(a)对修剪后的数组求值,并且可以在空数组上按预期工作:[].drop(1) => []
fearless_fool

4
也是最佳答案,因为OP说“摆脱第一个元素的最简单方法是什么”
notaceo 2014年

4
此答案表明,即使第一个和排除的答案已经超过100个投票,还是建议向下滚动。谢谢。
maddin2code 2015年

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 2013年

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

因此,与之不同的是shiftslice这将返回修改后的数组(可用于一个衬板)。


12
需要注意的一个陷阱:如果数组为空,则返回nil:[][1..-1] => nil而不是[]
Mohamad

2
不是[1,2,3].shift单线吗?
thekingoftruth

4
@thekingoftruth:是的,但是它的计算结果是您扔掉的元素,而不是数组的其余部分,因此需要另外一行。
fearless_fool13年

4
我喜欢这个答案,因为它是一个单行表达式,可以在任何地方使用。为了避免[] vs nil问题,您可以这样做arry[1..-1] || []。但是arry.drop(1)甚至更好。
fearless_fool13年

我正在使用这个cuz,因为它很简单,您将如何获得“数组减去移出的内容”,我看不到它是如何工作的……这是主要的答案,但似乎并不能回答问题,因为对于新手来说,下一步并不明显!
Louis Maddox

99

这很整洁:

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

如评论中所写,不更改原始列表的优点是。


2
非常聪明,并且运作完美。完成此操作后,即可使用变量“ head”和“ tail”。
nfriend21

3
这让我想起了很多。(let ((head (car mylist)) (tail (cdr mylist)) ...)
2013年

@ hurikhan77太好了!我一直想尝试一下。知道Darcs是用Haskell编写的,这激起了我的兴趣。
2013年

6
这个版本也还没有变异原始列表的优势
帕维尔Obrok

2
无需header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
额外




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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.