资讯专栏INFORMATION COLUMN

python 学习笔记 关于切片

jerryloveemily / 1972人阅读

摘要:我们还可以给切片进行命名,有名字的切片,显然更具有可读性。对切片赋值时,赋值符号右侧必须是一个可迭代对象,即使这个对象只包含一个元素,否则会提示错误。注以上内容主体来自于流畅的一书中切片和切片原理

切片是python中列表(list)、元组(tuple)、字符串(str)等序列类型都支持的一种操作,但实际上切片的功能比人们所想象的要强大的多。

切片区间为什么会忽略最后一个元素

当只有一个位置信息时,我们也可以读出该区间包含几个值,例如:rang(3) / my_list[:3]都是含有3个元素;

当起止位置信息都可见时,我们可以快速计算区间的长度,即(stop-start)即可;

可以利用一个任意下标将序列分割成互不交叉的两个子序列,如:my_list[:x] / my_list[x:]。

切片slice(start, stop, step)

对seq[start, stop, step]进行求值的时候,python会调用seq.__getitem__( slice(start, stop, step))。我们还可以给切片进行命名,有名字的切片,显然更具有可读性。如下例:

invoice = """
0.....6........15.....21
1001  prod_1   $17.5  3
1002  prod_2   $4.5   2
1003  prod_3   $10    1
1004  prod_4   $12    1
1005  prod_5   $8     1
"""

prod_id = slice(0, 6)
prod_desc = slice(6, 15)
prod_price = slice(15, 21)
prod_quantity = slice(21, None)
line_items = invoice.split("
")[2:]
for item in line_items:
    print(item[prod_price], item[prod_desc], item[prod_quantity])

运行结果如下:

给切片赋值

如果把切片放在赋值符号的左边,或者将切片作为del操作的对象,我们就可以对序列进行嫁接、切除或者修改等操作,十分快捷方便。

对切片赋值时,赋值符号右侧必须是一个可迭代对象,即使这个对象只包含一个元素,否则会提示错误 TypeError: can only assign an iterable。

切片的实现
>>> dir(slice)
["__class__", "__delattr__", "__dir__", "__doc__", "__eq__", "__format__", "__ge__", "__getattribute__", "__gt__", "__hash__", "__init__", "__init_subclass__", "__le__", "__lt__", "__ne__", "__new__", "__reduce__", "__reduce_ex__", "__repr__", "__setattr__", "__sizeof__", "__str__", "__subclasshook__", "indices", "start", "step", "stop"]

slice 是python的内置类型,类型所具有的indices方法可以帮助我们实现序列的切片操作。

S.indices(len) -> (start, stop, stride)
给定长度为len的序列,计算S表示的扩展切片的起始和结尾索引,以及步幅。超出边界的索引会被截掉。

如上图两个例子,假如现在有一个长度为5的序列seq,那么对于该序列而言,

seq[0, 10, 2] == seq[0, 5, 2]
seq[-3, 0, 0] == seq[2, 5, 1]

如果能够善用slice类型中Indices方法,则可以更加快捷实现自定义类型数据的切片操作。

注: 以上内容主体来自于《流畅的python》一书中 “2.4 切片” 和 “10.4.1 切片原理”

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42130.html

相关文章

  • python学习笔记切片

    摘要:取多个元素从头开始取多个元素切片结束,但是不包括该的元素。切片开始的不填则默认是从最前端即开始。当然,从尾端开始切片,也支持省略代表一直切到尾部。其他编程语言入都提供了很多操作字符串的函数,其实中可以利用切片轻松完成。 取一个list或者tuple的一部分是十分常见的操作。我们除了利用循环通过索引一个个获取元素外,python还为我们提供了方便的切片(Slice)操作符:。 我们定义一...

    TalkingData 评论0 收藏0
  • 四个月技术写作,我写了些什么?

    摘要:因为清楚地意识到自己的基础并不扎实,所以,几个月以来,我花了不少时间系统性地学习了一些内容。时间过得真快,现在能拿得出手的也就仅仅是字符串系列切片系列和迭代器系列了。关于技术写作和翻译,我初见门道,今后还会多作总结分享。 showImg(https://segmentfault.com/img/bVbn6bh?w=4167&h=2569); 从去年国庆节开始,我连续更新了 4 个月公众...

    WilsonLiu95 评论0 收藏0
  • 四个月技术写作,我写了些什么?

    摘要:因为清楚地意识到自己的基础并不扎实,所以,几个月以来,我花了不少时间系统性地学习了一些内容。时间过得真快,现在能拿得出手的也就仅仅是字符串系列切片系列和迭代器系列了。关于技术写作和翻译,我初见门道,今后还会多作总结分享。 showImg(https://segmentfault.com/img/bVbn6bh?w=4167&h=2569); 从去年国庆节开始,我连续更新了 4 个月公众...

    zhangrxiang 评论0 收藏0
  • 四个月技术写作,我写了些什么?

    摘要:因为清楚地意识到自己的基础并不扎实,所以,几个月以来,我花了不少时间系统性地学习了一些内容。时间过得真快,现在能拿得出手的也就仅仅是字符串系列切片系列和迭代器系列了。关于技术写作和翻译,我初见门道,今后还会多作总结分享。 showImg(https://segmentfault.com/img/bVbn6bh?w=4167&h=2569); 从去年国庆节开始,我连续更新了 4 个月公众...

    bingchen 评论0 收藏0
  • 四个月技术写作,我写了些什么?

    摘要:因为清楚地意识到自己的基础并不扎实,所以,几个月以来,我花了不少时间系统性地学习了一些内容。时间过得真快,现在能拿得出手的也就仅仅是字符串系列切片系列和迭代器系列了。关于技术写作和翻译,我初见门道,今后还会多作总结分享。 showImg(https://segmentfault.com/img/bVbn6bh?w=4167&h=2569); 从去年国庆节开始,我连续更新了 4 个月公众...

    idealcn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<