2010-10-12 49 views

回答

72

通过调用片具有相同的字段创建片,如果这样做,你会使用[开始:结束:步]符号:

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 
3

slice函数返回slice objects。 Slice对象是Python的内部类型之一,它为读取性能进行了优化 - 它们的所有属性都是只读的。

如果希望更改默认行为,则更改slice可能会很有用。例如,lxml使用切片符号来访问DOM元素(但是,我还没有确认他们是如何做到这一点的)。

28

下一个序列方括号表示无论是索引或切片取决于括号里面是什么:

>>> "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__方法,你需要测试的指标参数来确定它是否是相应的intslice和过程:

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对象有三个属性:startstopstep,和一个方法:indices,这需要一个参数,该对象的长度,并返回一个3元组:(start, stop, step)

5
>>> 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)),) 
>>> 
+2

请参阅Don的回复以获取解释。 – abc 2013-02-02 01:51:45

+0

这也是有益的,也指出可以有多个切片传递给'__getitem__':s [1:2:3,1:4:5] =>(切片(1,2,3),1 ,切片(4,5,无))'。 – OozeMeister 2017-11-04 21:55:56