一:列表简介:
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
[[]]