我想使用slice运算符提取前3个和最后3个项目。可以通过串联切片对象在一次调用中完成此操作吗?
module Tracking
def create(name)
object = new(name)
@instances ||= [] # NOW note this line
@instances.push(object) # using @instances
return object
end
def instances
@instances # just a getter now
end
end
class Customer
extend Tracking
attr_accessor :name
def initialize(name)
@name = name
end
def to_s
"[#{@name}]"
end
end
2.4.1 :098 > puts "Customer.instances: %s" % Customer.instances.inspect
Customer.instances: [#<Customer:0x007f9772187d40 @name="Jason">]
=> nil
2.4.1 :099 > puts "Customer.create: %s" % Customer.create("Jason")
Customer.create: [Jason]
=> nil
2.4.1 :100 > puts "Customer.create: %s" % Customer.create("Kenneth")
Customer.create: [Kenneth]
=> nil
2.4.1 :101 > puts "Customer.instances: %s" % Customer.instances.inspect
Customer.instances: [#<Customer:0x007f9772187d40 @name="Jason">, #<Customer:0x007f9772037080 @name="Jason">, #<Customer:0x007f977223d690 @name="Kenneth">]
以上内容返回错误,因为不可能使用a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
s1 = slice(None, 3)
s2 = slice(-3, None)
s = s1 + s2
a[s]
。还有另一种方法吗?
我不在寻找答案: s = s1 + s2
答案 0 :(得分:4)
没有对象s
使得a[s]
将是[1, 2, 3, 7, 8, 9]
。切片对象不支持串联,list.__getitem__
不了解可用于将两个切片捆绑在一起的任何对象。
在某个时候,您将必须切片两次并合并结果。您可以通过各种方式将其隐藏,例如,通过创建包装器,使wrapper(a)[s1, s2]
执行两个切片操作并合并结果,但是您不能将作业委派给列表。