首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python切片-to,我知道Python片,但是我如何使用内置的片对象呢?

Python切片-to,我知道Python片,但是我如何使用内置的片对象呢?
EN

Stack Overflow用户
提问于 2010-10-12 03:27:10
回答 6查看 55K关注 0票数 80

内置函数slice的用途是什么?我如何使用它?

我所知道的毕达通切片的直接方法- l1[start:stop:step]。我想知道我是否有一个片对象,那么我如何使用它呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-12 04:43:17

通过使用与执行start:end:step表示法使用的相同字段调用片来创建一个片:

代码语言:javascript
复制
sl = slice(0,4)

要使用该切片,只需将其作为索引传递到列表或字符串中:

代码语言:javascript
复制
>>> s = "ABCDEFGHIJKL"
>>> sl = slice(0,4)
>>> print(s[sl])
'ABCD'

假设您有一个固定长度文本字段的文件。您可以定义一个切片列表,以方便地从该文件中的每个“记录”中提取值。

代码语言:javascript
复制
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('')

# or this same code using itemgetter, to make a function that
# extracts all slices from a string into a tuple of values
import operator
rec_reader = operator.itemgetter(*fieldslices)
for rec in data:
    for field, field_value in zip(fields, rec_reader(rec)):
        print("{} : {}".format(field, field_value))
    print('')

指纹:

代码语言:javascript
复制
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
票数 108
EN

Stack Overflow用户

发布于 2010-10-12 06:16:45

序列后面的方括号表示索引或切片,具体取决于括号内的内容:

代码语言:javascript
复制
>>> "Python rocks"[1]    # index
'y'
>>> "Python rocks"[1:10:2]    # slice
'yhnrc'

这两种情况都由序列的__getitem__()方法处理(如果位于等号的左边,则为__setitem__() )。索引或切片作为单个参数传递给方法,Python的方法是将片表示法(在本例中为1:10:2)转换为片对象:slice(1,10,2)

因此,如果要定义自己的类似序列的类,或者重写另一个类的__getitem____setitem____delitem__方法,则需要测试索引参数以确定它是int还是slice,并相应地进行处理:

代码语言:javascript
复制
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)

票数 40
EN

Stack Overflow用户

发布于 2010-10-12 06:20:48

代码语言:javascript
复制
>>> 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)),)
>>>
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3911483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档