Python分片赋值求详细讲解
最近在看 http://book.douban.com/subject/486693...这本书。看到第二章分片赋值的时候不是很理解,google之后,也没得到想要的答案,
故想问,python 分片赋值 想求个详细的讲解,愿前辈帮个小忙。
首先你要理解什么是分片,也有的书叫切片(slice)。当你需要一个序列的子串的时候,你就可以使用切片操作
a = ['a','b','c','d','e','f','g']
在a这个序列中,如果你想截取里面['c','d','e']这个子序列,那么你就可以使用切片a[2:5]
它的语法形式是a[start:end],这里有一个区间边沿取值的问题。首先你要明确序列的索引是从0开始的,a[2:5]取值的范围是[2,5),前面是闭区间,后面是开区间,也就是2<=索引值<5这段区间里的元素。所以如果这样来切的话:a[1:1],得到的就是[],空序列。试问在序列a中,哪里有元素的索引是既>=1又<1的呢?
上面切片出来出来(a[2:5])的值是['c','d','e']。但是它返回的并不是一个值,而是一个引用,换句话说,a[2:5]之后所得到的子序列,如果你对它进行修改
那么它的修改就会反馈到原来的序列当中,你可以尝试一下:
a[2:5] = ['x','y','z'] print a a = ['a','b','x','y','z','f','g']
你对切片进行赋值已经反映到源序列当中。但是,如果我不赋值三个元素,我赋值两个,或者四个,那会发生什么情况呢?
看看下面的代码:
>>> a = ['a','b','c','d','e','f','g'] >>> a[2:5] = ['1','2'] >>> print a ['a', 'b', '1', '2', 'f', 'g'] >>> a = ['a','b','c','d','e','f','g'] >>> a[2:5] = ['1','2','3','4'] >>> print a ['a', 'b', '1', '2', '3', '4', 'f', 'g']
答案显而易见,就算你赋值元素个数和原来切片出来元素的个数不一样,它所反映到源序列的都是['c','d','e']这个子序列被改变。
也就是:a[2:5] = ['1','2']之后得到的不是想当然的['a', 'b', '1', '2', 'e','f', 'g']而是,['a','b','1','2','f','g']
如果你把一个空序列赋值给切片对象a[2:5] = [],那么反映到序列中的就是2<=索引<5的元素被删除了。和上面一样,再来看看代码,算是作为结束:
>>> a = ['a','b','c','d','e','f','g'] >>> a[2:5] = [] >>> print a >>> ['a','b','f','g'] >>> print len(a) 4 >>> a = ['a','b','c','d','e','f','g'] >>> print len(a) 7 >>> a[2:5] = ['1','2','3','4','5','6','7'] >>> print a ['a', 'b', '1', '2', '3', '4', '5', '6', '7', 'f', 'g'] >>> print len(a) 11
我还想说说几种切片的方法,因为它们实在太有趣了。
上面我们用到的索引一直都是正值,但是在python中,序列的索引值可以是负值。从最后一个元素索引开始计算,分别是-1,-2,-3,.....
我想换个字符串来测试,不要再abcd,1234的了。就用segmentfault.com吧!
>>> a = list('segmentfault.com') >>> print a ['s', 'e', 'g', 'm', 'e', 'n', 't', 'f', 'a', 'u', 'l', 't', '.', 'c', 'o', 'm'] #最后一个'm'的索引是-1,然后依次向前递减 >>> print a[-16:-4] ['s', 'e', 'g', 'm', 'e', 'n', 't', 'f', 'a', 'u', 'l', 't']
要注意区间的选取。-16<=索引值<-4
除此之外,我还可以在'segmentfault'中每隔两个字符地将截取到的字符组成序列。试试:
>>>print a[-16:-4:3] >>>['s', 'm', 't', 'u'] #隔了两个字符
在这里的3被称作步进值,步进切片的语法形式就是:seq[start:end:step],在start<=索引值<end中,隔step-1个字符来截取元素。(step >= 1)。
而且,这个步进值同样可以是负数,对应的形式就是seq[end:start:step],在start<=索引值<end中,隔|step|-1个字符来截取元素。我是这样来理解步进值的,它是规定了切片操作的方向,正值代表的是正方向(从左向右)切片,负值代表的是反方向切片。
所以a[-4:-16:-3]的意思就是:反方向从-16<=索引值<-4的元素中,隔两个元素来截取。
所以当你想要把这个序列反转的时候,你就可以从反方向截取所有元素a[::-1]。
通过这几种方法切片出来的对象,你都可以进行赋值,具体的你就自己尝试一下吧!
其实还有一种切片方式,叫缩略切片,因为我对它不是很了解,所以不打算写了。如果你有兴趣可以google一下。
总结一下:
- 当step为正值的时候,seq[start:end:step]表示的是在seq中,每隔step-1个字符,截取start<=索引值<end中的元素
- 当step为负值的时候,seq[end:start:step]表示的是在seq中,每隔|step|-1个字符,截取start<=索引值<end中的元素
注意是从哪边开始!
这样看还是挺混乱的,关键还是多练!
Ps:时间很紧,下午还要考试,可能会有错误。所以还是以官方文档和书本的为准吧。我的python版本是2.7.3。
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd20371.html
相关文章 Recommend
- • 2019年3月最新消息: Python 3.4.10 现已推出
- • [上海]招Python量化系统开发工程师
- • 优集品网络科技有限公司招Python中/高级工程师
- • 爱因互动科技发展有限公司招募Python开发攻城狮
- • mozio招聘Python/Django工程师
- • Kavout金融科技公司招Python研发工程师
- • Python数组逆向输出,编程练习题实例四十
- • Python数组插入排序,编程练习题实例三十九
- • Python矩阵for循环应用,编程练习题实例三十八
- • Python操作Redis数据库方面的问题
- • 请python高手帮我看看这段python代码中函数setter的
- • Python什么方法可以快速将两个队列变成字典
必知PYTHON教程 Must Know PYTHON Tutorials
- • python 解释器
- • python idle
- • python dir函数
- • python 数据类型
- • python type函数
- • python 字符串
- • python 整型数字
- • python 列表
- • python 元组
- • python 字典
- • python 集合
- • python 变量
- • python print
- • python 函数
- • python 类定义
- • python import
- • python help
- • python open
- • python 异常处理
- • python 注释
- • python continue
- • python pass
- • python return
- • python global
- • python assert
- • python if语句
- • python break
- • python for循环
- • python while循环
- • python else/elif
- • lambda匿名函数
必知PYTHON模块 Must Know PYTHON Modules
- • os 模块
- • sys 模块
- • re 正则表达式
- • time 日期时间
- • pickle 持久化
- • random 随机
- • csv 模块
- • logging 日志
- • socket网络通信
- • json模块
- • urlparse 解析URL
- • urllib 模块
- • urllib2 模块
- • robotparser 解析
- • Cookie 模块
- • smtplib 邮件
- • Base64 编码
- • xmlrpclib客户端
- • string 文本
- • Queue 线程安全
- • math数学计算
- • linecache缓存
- • threading多线程
- • sqlite3数据库
- • gzip压缩解压
最新内容 NEWS
- • django app提供pv信息的方法是什么
- • Django项目版本升级如何操作?
- • django较多数据传递如何优雅的呈现
- • django1.7获取参数问题求助
- • Django1.7使用内置comment遇到问题
- • python mysql数据库做insert操作时报_mysql_ex
- • 关于python mysql的duplicate insert机制的疑问
- • pymongo使用insert函数批量插入被中断要怎么
- • Python程序员解决棘手问题的常用库
- • 求助关于restfull api接口几个问题
图文精华 RECOMMEND
-
django1.7获取参数问题求助
-
Python程序员解决棘手问题的常用库
-
求问str()同__str__原理上有什么不同
-
scrapy框架里面用link extractor怎么能
-
python {}.fromkeys创建字典append添加操
-
python3 类型Type str doesn't support th
热点文章 HOT
- 学习Python有什么好的书籍推荐?
- Python匿名函数 Lambda表达式作用
- Python与Java、C、Ruby、PHP等编程语言有什么
- Python 正则中文网页字符串提取问题
- 如何为实时性应用存取经纬度?django my
- 想用python做个客户端,在二维码登录这个地
- 有让IDE可识别Python函数参数类型的方法吗
- Python字符串转换成列表正则疑问