一:列表简介:

  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 对象类型详解三:列表的更多相关文章

  1. 四:python 对象类型详解一:数字(下)

    一:位操作 除了一般的数学运算,python也支持c语言中的大多数数学表达式.这包括那些把整数当作二进制位串对待的操作.例如,还可以实现位移及布尔操作: >>> x = 1 > ...

  2. 三:python 对象类型详解一:数字(上)

    一:python 的数字类型: a)整数和浮点数 b)复数 c)固定精度的十进制数 d)有理分数 e)集合 f)布尔类型 g)无穷的整数精度 h)各种数字内置函数和模块 二:各种数字类型的详解 1,数 ...

  3. 十:python 对象类型详解六:文件

    一:文件 1.简介:内置open 函数会创建一个python 文件对象,可以作为计算机上的一个文件链接.在调用open 之后,可以通过调用返回文件对象的方法来读写相关外部文件.文件对象只是常见文件处理 ...

  4. 九:python 对象类型详解五:元组

    一:元组: 1,简单介绍:元组由简单的对象组构成.元组与列表非常类似,只不过元组不能在原处修改(它们)是不可变的,并且通常写成圆括号中的一系列项.虽然元组不支持任何方法调用,但元组具有列表的大多数属性 ...

  5. 六:python 对象类型详解二:字符串(下)

    一:字符串方法: 方法就是与特定对象相关联在一起的函数.从技术的角度来讲,它们是附属于对象的属性,而这些属性不过是些可调用的函数罢了.Python 首先读取对象方法,然后调用它,传递参数.如果一个方法 ...

  6. 八:python 对象类型详解四:字典

    一:字典通识: 1,字典通过键而不是偏移量来读取: 2,字典是任意对象的无序集合: 3,字典可变长.异构.任意嵌套: 4,字典属于可变映射类型: 5,对象引用表(散列表): 二:实际应用中的字典: 1 ...

  7. 五:python 对象类型详解二:字符串(上)

    一:常量字符串 常量字符串用起来相对简单,也许最复杂的事情就是在代码中有如此多的方法来编写它们. eg:单引号:'spam"m'   , 双引号: “spa'm” , 三引号:‘’‘... ...

  8. C++11 并发指南六(atomic 类型详解三 std::atomic (续))

    C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...

  9. JavaScript中的对象类型详解

    To be finished 摘要 1.什么是对象? 2.引用类型和原始类型 3.对象数据属性拥有的特性(Attributes) 4.如何创建对象 a.直接定义 var mango={color:&q ...

随机推荐

  1. Jmeter之Bean shell使用-常用内置变量

    Bean Shell常用内置变量   JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.l ...

  2. djangobb之forum.topics

    看djangobb源代码时,看到view的show_forum(request, forum_id, full=True)时,对于topics = forum.topics.order_by('-st ...

  3. [ 记录 ] Vue 对象数组中一项数据改变,页面不更新

    问题描述:将data中数据列表渲染到页面,循环生成 el-switch,点击页面中 el-switch 后数组中某项值改变,但是页面不更新 数据格式如下 export default{ data(){ ...

  4. 浅谈transient关键字

    1,用途 当一个对象实现了Serilizable接口,这个对象就可以被序列化.而有时候我们可能要求:当对象被序列化时(写入字节序列到目标文件)时,有些属性需要序列化,而其他属性不需要被序列化,打个比方 ...

  5. mysql每天凌晨0点准时启动taskeng.exe如何关闭

    MySQL弹出一个taskeng.exe. 内容如下:=====================Start Initialization====================mysql Instal ...

  6. Oracle 学习总结 - 物理结构

    参考了很多文章,学习自网络 数据库 = 实例(数据库启动时初始的进程和内存结构,进程会作用到对应的内存区域-数据写入器到写入内存缓冲区,日志写入器到日志缓冲区等) + 数据库(物理文件-控制文件,数据 ...

  7. ubuntu安装pgAdmin 4

    One way to install pgadmin4 is to download its Python wheel at https://www.postgresql.org/ftp/pgadmi ...

  8. LeetCode 312. Burst Balloons(戳气球)

    参考:LeetCode 312. Burst Balloons(戳气球) java代码如下 class Solution { //参考:https://blog.csdn.net/jmspan/art ...

  9. Java解决输出数组问题

    package test; public class doubleshuzu { public static void main(String[] args) { double a[][]; Stri ...

  10. UNION 与 UNION ALL的区别

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,列的数量.数据类型.顺序要保持一致!!! 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名. 例子: ...