我在Ruby Core中寻找一个Array等效String#split
,并且惊奇地发现它不存在。有没有比下面更优雅的方式将数组分成基于值的子数组?将数组拆分成基于值的子数组
class Array
def split(split_on=nil)
inject([[]]) do |a,v|
a.tap{
if block_given? ? yield(v) : v==split_on
a << []
else
a.last << v
end
}
end.tap{ |a| a.pop if a.last.empty? }
end
end
p (1..9).to_a.split{ |i| i%3==0 },
(1..10).to_a.split{ |i| i%3==0 }
#=> [[1, 2], [4, 5], [7, 8]]
#=> [[1, 2], [4, 5], [7, 8], [10]]
编辑:对于那些有兴趣,这引发了此请求的“真实世界”的问题可以在this answer,在那里我用@ FD的回答下面的实施可以看出。
好了,在Python,你可以把它转换成字符串(用逗号或东西分隔值),拆分,然后返回到列表中。不知道,如果这是Ruby中的一个选项。 – 2011-01-26 00:24:08
@Rafe它会,但只有当内容只是字符串。即使那样,那也不算高雅。 :p – Phrogz 2011-01-26 00:38:45
@Progrog如果他们是数字,它也可以很好地工作。你只需要做'','join'(list_of_nums中的[str(x)]],然后分割,然后重新加入并在逗号分割。功能,是的,优雅,呃没有。 – 2011-01-26 00:45:45