能取值亦能赋值的Python切片
切片,就像面包,给几刀,切成一片一片,可以做成吐司,也可以做成三明治,口味更佳:
列表(list)、元组(tuple)、字符串(str)都能进行切片,得到子片段,实际上切片操作比想象的要强大很多,能取值,亦能赋值。
忽略最后一个元素
切片是用下标和冒号来描述的,比如s[2:13]
。对于2, 3, ..., 12
这个序列,表达为[2, 13)
,左闭右开,比[2, 12]
和(1, 13)
都更合理,理由如下:
- 上限减去下限等于元素个数,比如
13 - 2 = 11
,刚好就有11个元素。 - 连续的范围没有重叠,比如
[2, 13)
和[13, 25)
是两个连续的范围,13只会包含在后一个里。
下标从0开始
对于10个元素,写成[0, 10)
比[1, 11)
更合理,理由如下:
N个元素,
[0, N)
比[1, N+1)
写法更简洁,不需要+1
。某个元素的下标等于排在它前面元素的个数,方便使用,比如:
0 1 2 3 4 5 6 7 8 9
^
前面有4个元素
好用的切片
以上两个数学理论给切片使用带来了很多好处:
当只有最后一个位置信息时,可以快速看出有几个元素,比如
my_list[:3]
返回3个元素。当起止位置信息都可见时,可以快速计算出长度,用
stop - start
就可以了,比如my_list[1:3]
长度为2。利用任意一个下标把序列切割成不重叠的两部分,只要写成
my_list[:x]
和my_list[x:]
就可以了,比如>>> my_list = [10, 20, 30, 40, 50, 60]
>>> my_list[:3]
[10, 20, 30]
>>> my_list[3:]
[40, 50, 60]
Python里的范围(range)也是忽略最后一个元素,下标从0开始的。
切片间隔
切片除了s[a:b]
,还有第三个下标s[a:b:c]
,意思是对s在a和b之间以c为间隔取值,c还可以为负,负值意味着反向取值。比如:
>>> s = "bicycle"
>>> s[::3]
"bye"
>>> s[::-1]
"elcycib"
>>> s[::-2]
"eccb"
a:b:c
更严谨的描述是start:stop:step
。
语法如此简洁,用脚想也知道是Python魔法方法干的好事!在对s[a:b:c]
进行求值的时候,Python实际上会调用s.__getitem__(slice(a, b, c))
,熟悉的配方,熟悉的味道。slice(a, b, c)
是a:b:c
用在[]
中返回的切片对象,slice()
是Python内置函数,示例:
invoice = "Mini Kit $34.95 1 $ 34.95"
SKU = slice(0, 8)
print(invoice[SKU])
切片赋值
切片有一个强大功能是给切片赋值,如果把切片放在赋值语句的左边,或把它作为del操作的对象,我们就可以对序列进行嫁接、切除或就地修改操作。示例:
>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del l[5:7]
>>> l
[0, 1, 2, 3, 4, 7, 8, 9]
>>> l[3:2] = [11, 22]
>>> l
[0, 1, 2, 11, 22, 3, 4, 7, 8, 9]
>>> l[2:5] = [100]
>>> l
[0, 1, 100, 3, 4, 7, 8, 9]
注意,如果赋值的对象是一个切片,那么赋值语句的右侧必须是个可迭代对象,即使只有单独一个值,否则会报错:
>>> l[2:5] = 100
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: can only assign an iterable
多维切片
除了一维切片,Python还支持多维切片,这在多维数组中能体现出来。NumPy是Python第三方库,提供了高阶数组,使得Python成为科学计算应用的主流语言。示例:
>>> import numpy
>>> a = numpy.arange(12)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> a.shape
(12,)
>>> a.shape = 3, 4
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[:, 1]
array([1, 5, 9])
>>> a[1:2, 2:3]
array([[6]])
>>> a[1:3, 2:4]
array([[ 6, 7],
[10, 11]])
在NumPy中,省略号...
用作多维数组切片的快捷方式,如果x是四维数组,那么x[i, ...]
就是x[i, :, :, :]
的缩写,比如:
>>> a.shape = 2, 2, 3
>>> a
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
>>> a[:, :, 1]
array([[ 1, 4],
[ 7, 10]])
>>> a[..., 1]
array([[ 1, 4],
[ 7, 10]])
小结
本文介绍了Python强大的切片操作,因为忽略最后一个元素和下标从0开始,所以切片用起来特别顺手,除了开始和结尾,还能设置切片间隔,间隔为负可以反向取值。切片赋值是切片另一个强大功能,需要注意的是赋值语句的右侧必须是个可迭代对象。
参考资料:
《流畅的Python》
能取值亦能赋值的Python切片的更多相关文章
- div赋值,取值和input赋值,取值
一.div取值 <div id="txtXiaofei" class="txt-panel">你好</div> 获取div的值$(&qu ...
- input标签元素,value属性取值问题,赋值
验证val:<input type="text" id="id" name="name" value="空值"&g ...
- jquery radio 取值 取消选中 赋值
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- jquery input 赋值和取值
记录一下: 在写一个input赋值,二话不说就直接利用了$('#xx').val()来进行取值和赋值,取值ok,赋值后利用alert显示正确,但是在html上并没有正确的显示出来,后来改为使用如下代码 ...
- Python数据科学手册-Pandas:数据取值与选择
Numpy数组取值 切片[:,1:5], 掩码操作arr[arr>0], 花哨的索引 arr[0, [1,5]],Pandas的操作类似 Series数据选择方法 Series对象与一维Nump ...
- Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)
Python:高级主题之(属性取值和赋值过程.属性描述符.装饰器) 背景 学习了Javascript才知道原来属性的取值和赋值操作访问的“位置”可能不同.还有词法作用域这个东西,这也是我学习任何一门语 ...
- python 字典(formkey 建立 取值 赋值 删除 )
formkey快速建立空字典 result = {}.fromkeys(['name','age','job'],None) print(result) #往字典里添加元素 result. ...
- Python_关于多线程下变量赋值取值的一点研究
关于多线程下变量赋值取值的一点研究 by:授客 QQ:1033553122 1.代码实践1 #!/usr/bin/env python # -*- coding:utf-8 -*- __author_ ...
- jQuery radio的取值与赋值
取值: $("input[name='radioName']:checked").val(); 赋值: $("input[name='radioName'][value= ...
随机推荐
- 日志框架(Log4J、SLF4J、Logback)--日志规范与实践
文章目录 一.Log4j 1.1新建一个Java工程,导入Log4j包,pom文件中对应的配置代码如下: 1.2resources目录下创建log4j.properties文件. 1.3输出日志 1. ...
- EIGRP和OSPF__EIGRP
EIGRP解释 1.Enhanced Interior Gateway Routing Protocol 即增强内部网关路由协议.EIGRP同内部网关路由选择协议(IGRP)一样,是Cisco公司的私 ...
- 并发编程补充--方法interrupted、isinterrupted详解
并发编程 interrupted()源码 /** * Tests whether the current thread has been interrupted. The * <i>int ...
- three.js cannon.js物理引擎制作一个保龄球游戏
关于cannon.js我们已经学习了一些知识,今天郭先生就使用已学的cannon.js物理引擎的知识配合three基础知识来做一个保龄球小游戏,效果如下图,在线案例请点击博客原文. 我们需要掌握的技能 ...
- 设计模式(五)——原型模式(加Spring框架源码分析)
原型模式 1 克隆羊问题 现在有一只羊 tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和 tom 羊 属性完全相同的 10 只羊. 2 传统方式解决克隆羊问题 1) 思路分析(图 ...
- LSTM机器学习生成音乐
目录 LSTM机器学习生成音乐 数据集介绍 将mid转成note数组 将note数组转成mid文件 获取数据集并将其保存 将note进行编号 构建数据集 截取数据 进行one-hot编码 构建模型 训 ...
- Codeforces Round #654 (Div. 2)
比赛链接:https://codeforces.com/contest/1371 A. Magical Sticks 题意 有 $n$ 根小棍,长度从 $1$ 到 $n$,每次可以将两根小棍连接起来, ...
- Codeforces Round #533 (Div. 2) B. Zuhair and Strings(字符串)
#include <bits/stdc++.h> using namespace std; int main() { int n,k;cin>>n>>k; stri ...
- Codeforces Round #533 (Div. 2) A. Salem and Sticks(枚举)
#include <bits/stdc++.h> using namespace std; int main() { int n;cin>>n; int a[n];for(in ...
- 2015 German Collegiate Programming Contest (GCPC 15) + POI 10-T3(12/13)
$$2015\ German\ Collegiate\ Programming\ Contest\ (GCPC 15) + POI 10-T3$$ \(A.\ Journey\ to\ Greece\ ...