内置函数slice
有什么用,我该如何使用它?
Pythonic切片的直接方式我知道 - l1[start:stop:step]
。我想知道如果我有切片对象,那我该如何使用它?Python切片技巧,我知道Python切片,但我怎样才能使用内置的切片对象呢?
回答
通过调用片具有相同的字段创建片,如果这样做,你会使用[开始:结束:步]符号:
sl = slice(0,4)
要使用切片,只是把它当作好像它是指数成列表或字符串:
>>> s = "ABCDEFGHIJKL"
>>> sl = slice(0,4)
>>> print(s[sl])
'ABCD'
假设您有一个固定长度文本字段的文件。您可以定义切片列表,以便轻松从该文件中的每个“记录”中提取值。
data = """\
0010GEORGE JETSON 12345 SPACESHIP ST HOUSTON TX
0020WILE E COYOTE 312 ACME BLVD TUCSON AZ
0030FRED FLINTSTONE 246 GRANITE LANE BEDROCK CA
0040JONNY QUEST 31416 SCIENCE AVE PALO ALTO CA""".splitlines()
fieldslices = [slice(*fielddef) for fielddef in [
(0,4), (4, 21), (21,42), (42,56), (56,58),
]]
fields = "id name address city state".split()
for rec in data:
for field,sl in zip(fields, fieldslices):
print("{} : {}".format(field, rec[sl]))
print('')
打印:
id : 0010
name : GEORGE JETSON
address : 12345 SPACESHIP ST
city : HOUSTON
state : TX
id : 0020
name : WILE E COYOTE
address : 312 ACME BLVD
city : TUCSON
state : AZ
id : 0030
name : FRED FLINTSTONE
address : 246 GRANITE LANE
city : BEDROCK
state : CA
id : 0040
name : JONNY QUEST
address : 31416 SCIENCE AVE
city : PALO ALTO
state : CA
slice
函数返回slice objects。 Slice对象是Python的内部类型之一,它为读取性能进行了优化 - 它们的所有属性都是只读的。
如果希望更改默认行为,则更改slice
可能会很有用。例如,lxml
使用切片符号来访问DOM元素(但是,我还没有确认他们是如何做到这一点的)。
下一个序列方括号表示无论是索引或切片取决于括号里面是什么:
>>> "Python rocks"[1] # index
'y'
>>> "Python rocks"[1:10:2] # slice
'yhnrc'
这些情况都被__getitem__()
方法处理(或__setitem__()
,如果在等号左边)。索引或切片作为单个参数传递给方法,并且t他这样做的方式是通过将切片符号(在本例中为1:10:2
)转换为切片对象:slice(1,10,2)
。
所以,如果你要定义自己的序列状类或覆盖另一个类的__getitem__
或__setitem__
或__delitem__
方法,你需要测试的指标参数来确定它是否是相应的int
或slice
和过程:
def __getitem__(self, index):
if isinstance(index, int):
... # process index as an integer
elif isinstance(index, slice):
start, stop, step = index.indices(len(self)) # index is a slice
... # process slice
else:
raise TypeError("index must be int or slice")
甲slice
对象有三个属性:start
,stop
和step
,和一个方法:indices
,这需要一个参数,该对象的长度,并返回一个3元组:(start, stop, step)
。
>>> class sl:
... def __getitem__(self, *keys): print keys
...
>>> s = sl()
>>> s[1:3:5]
(slice(1, 3, 5),)
>>> s[1:2:3, 1, 4:5]
((slice(1, 2, 3), 1, slice(4, 5, None)),)
>>>
请参阅Don的回复以获取解释。 – abc 2013-02-02 01:51:45
这也是有益的,也指出可以有多个切片传递给'__getitem__':s [1:2:3,1:4:5] =>(切片(1,2,3),1 ,切片(4,5,无))'。 – OozeMeister 2017-11-04 21:55:56
这对我有用。 def __slice __(self,start = None,end = None,step = None):return self.obj [slice(start,end,step)] – user2290820 2014-12-14 15:18:13