核心知识点:

1.使用负步进可以反转取值字符串及ASCII。

2.stride最好不要与start和end用在一起,会降低代码可读性。

除了基本的切片操作之外,python还提供了somelist[start:end:stride]形式的写法,以实现步进式切割,也就是从每n个元素里面取一个出来。例如:

In [1]: a = []
In [2]: a = ['red','orange','yellow','green','blue','purple']
In [3]: odds = a[::2]
In [4]: evens = a[1::2]
In [5]: print(odds)
['red', 'yellow', 'blue']
In [6]: print(evens)
['orange', 'green', 'purple']

问题在于,采用stride方式切片,经常会出现不符合预期的结果。

例如,python中有一种常见的技巧,能够把以字节形式存储的字符串反转过来,这个技巧就是采用-1做步进值。

(关于-1反取,可参考博客:http://www.cnblogs.com/yangmingxianshen/p/7995234.html)

In [43]: x = b'mongoose'
In [44]: y = x[::-1]
In [45]: print(y)
b'esoognom'

但是这种技巧对于字符串和ASCII字符有用,但是对于已经编码成为utf-8的unicode字符来说,则是无效的

In [46]: w = '你好'
In [47]: x = w.encode('utf-8')
In [48]: y = x[::-1]
In [50]: z = y.decode('utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-50-7299a67a0700> in <module>()
----> 1 z = y.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 0: invalid start byte

除了-1之外,其他的负步进值有没有意义呢?

In [52]: a = ['a','b','c','d','e','f','g','h']
In [53]: a[::2]
Out[53]: ['a', 'c', 'e', 'g']
In [54]: a[::-2]
Out[54]: ['h', 'f', 'd', 'b']

负的步进值会从尾部开始取值。如果给出start和end会怎样?

In [55]: a[2::2]
Out[55]: ['c', 'e', 'g']
In [56]: a[-2::2]
Out[56]: ['g']
In [57]: a[-2::-2]
Out[57]: ['g', 'e', 'c', 'a']
In [58]: a[-2:2:-2]
Out[58]: ['g', 'e']
In [59]: a[2:2:-2]
Out[59]: []

在切割列表的时候,如果指定了stride,那么代码可能会变得相当费解。

在一对括号里写上3个数字显得拥挤,从而使代码不易阅读,这样的写法使得start和end索引的含义变得模糊。

为了解决这种问题,我们不应该把stride与start和end写在一起。如果非要用stride,那就尽量采用正值。

如果一定要配合start和end,可以将步进切割和切片分开。

In [60]: b = a[::2]
In [61]: c = b[1:-1]
In [62]: print(c)
['c', 'e']

这种做法会产生一份浅拷贝数据,因此会带来额外的内存消耗。

第6条:在单次切片操作内,不要同时指定start、end和stride的更多相关文章

  1. Python序列的切片操作与技巧

    切片操作 对于具有序列结构的数据来说,切片操作的方法是:consequence[start_index: end_index: step]. start_index: 表示是第一个元素对象,正索引位置 ...

  2. 彻底搞懂Python切片操作

        在利用Python解决各种实际问题的过程中,经常会遇到从某个对象中抽取部分值的情况,切片操作正是专门用于完成这一操作的有力武器.理论上而言,只要条件表达式得当,可以通过单次或多次切片操作实现任 ...

  3. 92.QuerySet API中的切片操作详细使用

    切片操作: 使用情况分析:在我们的CSDN的个人主页会显示我们个人发布的多篇文章(20篇),如果还想查看更多,就可以点击最下方的"查看更多"按钮,在这里对首页的文章的个数的限制就用 ...

  4. Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档

    array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片 ...

  5. python切片操作

    序列类型是其元素被顺序放置的一种数据结构类型,这种方式允许通过下标的方式来获得某一个数据元素,或者通过指定下标范围来获得一组序列的元素.这种访问序列的方式叫做切片.字符串也可以使用切片操作.切片操作符 ...

  6. 关于javascript里面仿python切片操作数组的使用方法

    其实在使用了好一段时间的 python之后,我觉得最让我念念不忘的并不是python每次在写函数或者循环的时候可以少用{}括号这样的东西(ps:其实也是了..感觉很清爽,而且又开始写js的时候老是想用 ...

  7. python学习之“切片操作从入门到精通”

    在python学习开发的过程中,我们总是不断的要对List(列表),Tuple(元组)有取值操作:假如我们有一个列表List1现在想取出1其中的前5个元素,改怎么操作呢? >>> L ...

  8. Numpy入门 - 数组切片操作

    本节主要演示数组的切片操作,数组的切片操作有两种形式:更改原数组的切片操作和不更改原数组的切片操作. 一.更改原数组的切片操作 import numpy as np arr = np.array([1 ...

  9. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

随机推荐

  1. 【Java】各种软件安装与环境配置的失败

    又来到了java的世界,看了一段时间的视频.感觉太空虚,便从网上找到一个教程.想做几个demo试试,少不了的前期准备:Java开发环境配置,Eclipse JSP/Servlet 环境搭建等.     ...

  2. TCP应用程序通信协议的处理

    TCP应用程序通信协议的处理 flyfish 2015-6-29 一 流式处理 TCP是一种流协议(stream protocol).TCP数据是以字节流的形式传递给接收者的,没有固有的"报 ...

  3. c# 冒号 :

    1.表示继承关系 class classA:classB 2.继承构造, 调用自己这个类的某个构造函数,因为有的类构造函数很多参数,而有的参数又不是必须填写,或者可以提供一些默认值,就跟重载是一样的道 ...

  4. Spring4整合Hibernate5时不能自动生成表结构

    © 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: Spring4整合Hibernate5时,不再使用hibernate.cfg.xml,将其内容整合到Spring配置文件中,启动后不能 ...

  5. TMS320C6455 SRIO 实现方案

    TMS320C6455 SRIO 实现方案 SRIO(Serial RapidIO)构架是一种基于高性能包交换的互连技术,主要功能是完成在一个系统内的微处理器.DSP.通信和网络处理器.系统存储器以及 ...

  6. 《HBase in Action》 第二章节的学习总结 ---- HBase基本组成

    准备工作:采用的HBase版本是:CDH4.5,其中的Hadoop版本是:hadoop-2.0.0-cdh4.5.0:HBase版本是:hbase-0.94.6-cdh4.5.0: Hbase的配置文 ...

  7. View Controller容器

    在 iOS 5 之前,view controller 容器是 Apple 的特权.实际上,在 view controller 编程指南中还有一段申明,指出你不应该使用它们.Apple 对 view c ...

  8. SecureCRT 设置字体跟颜色

    SecureCRT 绝佳配色方案, 保护你的眼睛 分类: Linux 软件使用2013-05-17 08:45 24038人阅读 评论(11) 收藏 举报 SecureCRT 绝佳配色方案, 保护你的 ...

  9. 嵌入式开发之工具---比开发手册更重要的一个命令 man page

    man http://bbs.chinaunix.net/thread-826490-1-1.html http://read.pudn.com/downloads70/ebook/254107/ch ...

  10. Java多线程之~~~~synchronized 方法

    在多线程开发中,总会遇到多个在不同线程中的方法操作同一个数据,这样在不同线程中操作这个数据不同的顺序 或者时机会导致各种不同的现象发生,以至于不能实现你预期的效果,不能实现一致性,这时候就能够使用 s ...