七:python 对象类型详解三:列表
一:列表简介:
1,列表可以包含任何种类的对象:数字、字符串甚至集合对象类型。列表都是可变对象,它们都支持在原处修改的操作,可以通过指定的偏移量和分片、列表方法调用、删除语句等方法来实现。关键的作用有一下几个:
a) 任意对象的有序集合:从功能上看,列表就是收集其他对象的地方,你可以把它们看作组。同时列表所包含的每一项都保持了从左到右的位置顺序(也就是说,它们是序列)。
b) 通过偏移读取:可以通过列表对象的偏移对其进行索引,也可以执行分片和合并置类的任务。
c) 可变长度、异构以及嵌套:与字符串不同的是,列表可以实地的增长或者缩短(长度可变),并且可以包含任何类型的对象而不仅仅是包含有单个字符的字符串(异构)。列表能够包含其他复杂的对象,又能够支持任意的嵌套,所以可以创建列表的子列表的子列表等。
d) 属于可变序列的分类:列表支持在原处的修改(他们是可变的),也可以响应所有针对字符串序列的操作,例如,索引、分片以及合并。唯一的区别:当应用于字符串上的合并和分片这样的操作应用于列表时,返回新的列表。然而列表时可变的,因此他们也支持字符串不支持的其他操作(例如,删除和索引赋值操作,他们都是在原处修改列表)。
e) 对象引用数组:实际上,从Python 解释器内部,列表就是C数组而不是链接结构。每当引用时,Python 总是会将这个引用指向一个对象,所以程序只需处理对象的操作,当把一个对象赋给一个数据结构元素或变量名时,python 总是会存储对象的引用,而不是对象的一个拷贝。
二:实际应用中的列表:
1,基本列表操作:由于列表是序列,它支持很多与字符串相同的操作。例如,列表对“+”和“*”操作的响应与字符串很相似,也是合并和重复,只不过结果是一个新的列表,而不是一个字符串。
2,列表迭代和解析:列表解析只不过是通过对序列中的每一项用一个表达式来构建一个新的列表的方式:
>>>res = [c *4 for c in "spam"]
>>>res
['ssss','pppp','aaaa','mmmm']
另外,内置的函数map做类似的工作,但它对序列中的 各项应用一个函数并把结果收集到一个新的列表中:
>>>list(map(abs,[-2,-1,0,1,2]))
[2,1,0,1,2]
3,索引、分片和矩阵:由于列表是序列,对于序列而言,索引和分片操作与字符串中的操作基本相同。但是索引时返回的是索引的一个对象,而分片的返回结果往往是返回一个新的列表。注意:由于可以在列表中嵌套列表(和其他对象类型),有时需要将几次索引操作连在一起使用来深入到数据结构中去。例如矩阵(多维数组)就是嵌套了子列表的列表:
>>>matrix = [[1,2,3],[4,5,6],[7,8,9]]
>>>matrix[1] #一次索引将会得到一整行,也就是嵌套的子列表
[4,5,6]
>>>matrix[1][1] #两次索引得到某一行里的其中一项
5
三:原处修改列表:
1,由于列表是可变的,它们支持原处修改列表对象的操作。注意:如果你在原处修改一个对象时,可能同时会影响一个以上指向它的引用。
2,索引与分片的赋值:当使用列表的时候,可以将它赋值给一个特定项(offset)或者整个片段(分片)来改变它的内容:
>>>L = ['spam','SPAM','Spam!'] #原地索引赋值修改
>>>L[1] = 'eggs'
>>>L
['spam','eggs','Spam!']
>>>L[0 : 2] = ['eat','more'] #分片的赋值
>>>L
['eat','more','Spam!']
索引和分片的赋值都是原地修改,Python 用一个新值取代指定偏移的对象引用。实际上,分片赋值是一次性替换整个片段。因为被赋值的序列长度不一定要与被赋值的分片的长度相匹配,所以分片赋值能够用来替换(覆盖)、增长(插入)和缩短(删除)主列表。Note:当赋值的值与分片重叠时,就需要详细的分析:例如,L[2 :5] = L[3 : 6] 是可行的,这是因为要被插入的值会在左侧删除发生前被取出。
3,列表方法调用:L.append():能够简单地将一个单项(对象引用)加至列表末端。与合并不同的是,append()允许传入单一对象而不是列表。L.append(x)与L+[x] 结果类似,不同的是,前者原地修改,而后者会生成新的列表。L.sort() :原地对列表进行排序。默认以递增的顺序进行排序。另外,我们可以通过传入关键字来修改排序行为---这是指定按名称传递的函数调用中特殊的“name = value”语法,key 参数给出了一个单个参数的函数,它返回在排序中使用的值,reverse 参数允许排序按照降序而不是升序进行:
>>> L = ['abc','ABD','aBe'] #默认升序
>>> L.sort()
>>> L
['ABD', 'aBe', 'abc']
>>> L = ['abc','ABD','aBe']
>>> L.sort(key = str.lower) #key指定按小写字母进行排序
>>> L
['abc', 'ABD', 'aBe']
>>> L = ['abc','ABD','aBe']
>>> L.sort(key=str.lower,reverse =True) #key and reverse 指定按小写字母降序
>>> L
['aBe', 'ABD', 'abc']
warning:append() 和 sort() 原处修改相关的列表对象,而结果并没有返回列表(技术上,返回值为None)。如果编辑类似 L = L.append(x) 这样的语句,将不会得到L修改后的值(实际上,会失去整个列表的引用)。所以,可以用sortd()函数来返回一个新的列表(而不是原处修改):
>>> L
['abc', 'ABD', 'aBe']
>>> sorted(L,key=str.lower,reverse=True) #用sorted()返回一个新的列表
['aBe', 'ABD', 'abc']
>>> L = ['abc','ABD','aBe']
>>> sorted[x.lower() for x in L,reverse=True] #先转换大小写,再排序
['abe', 'abd', 'abc']
>>> L
['abc', 'ABD', 'aBe']
最后一个例子,用列表解析在排序前转换为小写,但是结果不包含最初的列表的值,因为这是用key参数来实现的。后者在排序中临时应用,而不会改变排序的值。
内置的reverse()函数,像sorted()一样的工作,但是,它必须包装在一个list调用中,因为它是一个迭代器。
>>>L = [4,3,2,1] #内置reverse()函数必须包装在list调用中
>>>list(reversed[L])
[1,2,3,4]
在某些类型的应用程序中,往往会把这里用到的列表pop() 方法和append() 方法联用,来实现快速的后进先出堆栈结构。列表的末端作为堆栈的顶端。位置删除pop() 方法也能够接受某一个即将删除并返回的元素的偏移(默认为最后一个元素),其它列表方法也可以通过值删除(remove)某元素,在偏移处插入(insert)某元素,查找某元素的偏移(index)等。
4,其他常见列表操作:可用del 语句在原处删除某项或某片段。因为分片赋值是删除外加插入操作,也可以通过将空列表赋值给分片来删除列表片段(L[i:j] = [])。另一方面,将空列表赋值给一个索引只会在指定的位置存储空列表的引用,而不是删除:
>>> L = ['Already','got','one'] #分片赋值==删除
>>> L[1 : ] = []
>>> L
['Already']
>>> L[0] = [] #单项索引赋值在指定位置存储空列表的引用
>>> L
[[]]
七:python 对象类型详解三:列表的更多相关文章
- 四:python 对象类型详解一:数字(下)
一:位操作 除了一般的数学运算,python也支持c语言中的大多数数学表达式.这包括那些把整数当作二进制位串对待的操作.例如,还可以实现位移及布尔操作: >>> x = 1 > ...
- 三:python 对象类型详解一:数字(上)
一:python 的数字类型: a)整数和浮点数 b)复数 c)固定精度的十进制数 d)有理分数 e)集合 f)布尔类型 g)无穷的整数精度 h)各种数字内置函数和模块 二:各种数字类型的详解 1,数 ...
- 十:python 对象类型详解六:文件
一:文件 1.简介:内置open 函数会创建一个python 文件对象,可以作为计算机上的一个文件链接.在调用open 之后,可以通过调用返回文件对象的方法来读写相关外部文件.文件对象只是常见文件处理 ...
- 九:python 对象类型详解五:元组
一:元组: 1,简单介绍:元组由简单的对象组构成.元组与列表非常类似,只不过元组不能在原处修改(它们)是不可变的,并且通常写成圆括号中的一系列项.虽然元组不支持任何方法调用,但元组具有列表的大多数属性 ...
- 六:python 对象类型详解二:字符串(下)
一:字符串方法: 方法就是与特定对象相关联在一起的函数.从技术的角度来讲,它们是附属于对象的属性,而这些属性不过是些可调用的函数罢了.Python 首先读取对象方法,然后调用它,传递参数.如果一个方法 ...
- 八:python 对象类型详解四:字典
一:字典通识: 1,字典通过键而不是偏移量来读取: 2,字典是任意对象的无序集合: 3,字典可变长.异构.任意嵌套: 4,字典属于可变映射类型: 5,对象引用表(散列表): 二:实际应用中的字典: 1 ...
- 五:python 对象类型详解二:字符串(上)
一:常量字符串 常量字符串用起来相对简单,也许最复杂的事情就是在代码中有如此多的方法来编写它们. eg:单引号:'spam"m' , 双引号: “spa'm” , 三引号:‘’‘... ...
- C++11 并发指南六(atomic 类型详解三 std::atomic (续))
C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...
- JavaScript中的对象类型详解
To be finished 摘要 1.什么是对象? 2.引用类型和原始类型 3.对象数据属性拥有的特性(Attributes) 4.如何创建对象 a.直接定义 var mango={color:&q ...
随机推荐
- hive orc update
hive-site.xml --><configuration> <!-- WARNING!!! This file is auto generated for documen ...
- Mybatis十( mybatis其他使用)
1.批量执行 public void addUser(User user); <insert id="addUser" parameterType="model.U ...
- java中线程池的使用
public static ExecutorSevice newSingleThreadExecutor() public static ExecutorSevice newFixedThreadPo ...
- vue中修改了数据但视图无法更新的情况[转载]
我们有时候常碰到vue中明明修改了数据,但是视图无法更新,因此我总结了一点点碰到此类的情况: 1.v-for遍历的数组,当数组内容使用的是arr[0].xx =xx更改数据,vue无法监测到 数组数据 ...
- 正则表达式——WPF输入控件TextBox 限定输入特定字符
概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤逻辑. 目的: 给定一个正 ...
- ABAP-异常捕获
异常处理 基于类的异常exception classes 捕获 使用老式方式捕获catchable runtime errors 向上抛出异常 手动触发异常(类异常) 6.1版本以后,TRY…ENDT ...
- VULKAN学习资料收集
https://github.com/vinjn/awesome-vulkan 张静初 https://zhuanlan.zhihu.com/p/24798656 知乎 https://develop ...
- Nginx缓存配置以及nginx ngx_cache_purge模块的使用
web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...
- Unity 平台依赖编译
位置:unity文档-Manual-Scripting-Platform dependent compilation Property: Function: UNITY_EDITOR #define ...
- 一个rcu回调导致的简单死锁
在自有模块的处理中,我们设计了一个内核线程去做gc, 但同时,我们又用到了rcu,rcu中也会去抢gc的锁,由于该锁用的spin_lock,而不是spin_lock_bh,并没有关软中断,所以在rcu ...