列表
Python的列表对象是这个语言提供的最通用的序列,他没有大小,类型的限制,可以随意修改其内容。
序列操作
由于列表是序列的一种,所以对字符串的序列操作这里都适用,但是不同的就是结果有可能是列表,列表有点像其他语言的数组,只是他可以有不同类型的存在。
>>> line=[123,'abc']
>>> line
[123, 'abc']
列表还支持像多维数组一样的嵌套。
>>> line=[line,line,line]
>>> line
[[123, 'abc'], [123, 'abc'], [123, 'abc']]
>>> line=[1,[2,'abcd'],[3,'efgh']]
>>> line[2]
[3, 'efgh']
列表的元素个数:
>>> len(line)
3
它将列表中的每个列表看做一个整体,所以说结果是3.
对列表的索引和切片:
>>> line=[[1,'a'],[2,'b'],[3,'c']]
>>> line
[[1, 'a'], [2, 'b'], [3, 'c']]
>>> line[1]
[2, 'b']
>>> line[1:3]
[[2, 'b'], [3, 'c']]
>>> line[::-1]
[[3, 'c'], [2, 'b'], [1, 'a']]
对字符串的索引与切片相同,但是列表的中可以存放列表,这就决定了,他有不一样的地方,他可以进行索引和切片/索引混搭,但前面一定要是索引,只有确定了一个元素才能进行后面的确定。
>>> line=[1,[2,'abcd'],[3,'efgh']]
>>> line[1][0]
2
>>> line[1][::-1]
['abcd', 2]
类型特定的操作
类表能按需要来增大和减小列表,来响应其特定的操作。
>>> line=[132,'abc']
>>> line.append('1.23')
>>> line
[132, 'abc', '1.23']
>>> line.pop(1)
'abc'
>>> line
[132, '1.23']
列表的append方法扩充了列表的方法,并在尾部插入一项;pop的方法移除给定偏移的一项,删除选定的那项,从而使列表减小。其他的列表方法可以在任意位置插入(insert)元素,按照值移除(remove)元素等。。。因为列表的大小是可变的,所以它的改变没有生成新的列表,而是在原来列表进行修改的,这和字符串不一样,字符串的修改时产生新的字符,并且变量指向新的字符串,Python的垃圾回收机制将原有字符串回收掉。
>>> l=['bb','aa','cc']
>>> l.sort()
>>> l
['aa', 'bb', 'cc']
>>> l.reverse()
>>> l
['cc', 'bb', 'aa']
sort方法是对列表升序排列,reverse方法是对列表翻转,他们都是对源字符串进行修改。
小结:
什么样是对源序列进行操作呢?
就是看是否需要变量进行接收,也就是前面是否需要一个变量和等号。
边界检查
列表没有固定大小,但是Python还是不允许引用不存在的元素。这是有意为之的,由于去给列表边界外的赋值,往往会非常饿、危险(c语言更是如此,更糟糕的是c语言还没有检查机制),Python并不会增大他的大小,而去响应你错误的操作。所以他会返回给你个错误。(但是字符串的切片是可以的,但是索引是不可以的)
嵌套
Python核心数据类型的一个优秀的特性就是他们支持任意的嵌套。能够以任意的组合对其进行嵌套,多深层次的嵌套都是可以的(例如,让一个列表包含一个字典,并让这个字典包含另一个列表)。这种特性的一个应用就是实现矩阵。
>>> m=[[1,2,3],
[4,5,6],
[7,8,9]]
>>> m
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> m[1]
[4, 5, 6]
>>> m[1][2]
6
列表的解析
Python中不光有处理序列操作和列表的方法,还有一个更高级的操作,称作列表解析表达式,从而提供了一种处理像矩阵这样结构强大的工具。假如我们需要从列表的矩阵中提取出第二列。因为矩阵是按照行存储的,索引可以通过简单的索引进行获得行,使用列表解析可以同样简单的获得列。
>>> m
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> cl=[row[1]for row in m]
>>> cl
[2, 5, 8]
列表解析源自集合的概念。他是一种通过在一个序列中运行一个表达式而创建的一个新列表。每次一个,从左到右。列表解析是编写在方括号中的(提醒你在创建列表这个事实),并且有表达式和循环结构都使用了一个变量米名(这里是row)。之前的这个列表解析表达式基本上就是他字面上说讲的:“把在矩阵m中的每个row中的row[1],放在一个新列表中”。其结果就是一个包含原矩阵第二列的新矩阵。
其实还有很多例子,但是这些都是用循环或判断去限定实现的,也就是说,读取时候是可以为表达式的。