03-Python的核心数据类型-列表
列表
Python的列表对象是这个语言提供的最通用的序列。列表是一个任意类型的对象的位置相关的有序集合,它没有固定大小。不像字符串,其大小是可变的,通过对偏移量进行复制以及其他各种列表的方法进行调用,确实能够修改列表的大小。
序列操作
我们可以定义一个列表:它拥有三个不同的元素:
>>> L = [123, 'spam', 1.23]
>>> len(L)
3
我们能够对列表进行索引、切片等操作,就像对字符串所做的操作一样
>>> L[0] #根据索引获取元素
123
>>> L[:-1] #切片操作,返回一个新的列表
[123, 'spam']
>>> L + [4, 5, 6] #添加元素
[123, 'spam', 1.23, 4, 5, 6]
>>> L #我们并没有改变原列表
[123, 'spam', 1.23]
类型特定的操作
序号 | 函数 | 注释 |
---|---|---|
1 | list.append(obj) | 在列表末尾添加新元素 |
2 | list.count(obj) | 统计某个元素在列表中出现的次数 |
3 | list.extend(seq) | 在列表末尾一次性追加另一个序列中的多个值 |
4 | list.index(obj) | 从列表中查找第一次出现该元素的索引 |
5 | list.insert(index,obj) | 将对象插入列表 |
6 | list.pop(obj) | 移除列表中最后一个元素并返回该元素的值 |
7 | list.remove(obj) | 移除指定元素 |
8 | list.reverse() | 反转列表中的元素 |
9 | list.sort(func) | 对元列表进行排序 |
10 | cmp(list1, list2) | 比较两个列表的元素 |
11 | len(list) | 列表元素的个数 |
12 | max(list) | 返回列表元素的最大值 |
13 | min(list) | 返回列表元素的最小值 |
14 | list(seq) | 将元组转化为列表 |
>>> L
[123, 'spam', 1.23]
>>> L.append('NIU') #末尾追加
>>> L
[123, 'spam', 1.23, 'NIU']
>>> L.pop(2) # 弹出后将从原列表中移除该元素
1.23
>>> L
[123, 'spam', 'NIU']
>>> L.insert(1,'Chen') #对指定位置进行插入操作
>>> L
[123, 'Chen', 'spam', 'NIU']
>>> L.remove('Chen') #删除指定元素
>>> L
[123, 'spam', 'NIU']
>>> L.count('spam')
1
>>> L.append('spam')
>>> L
[123, 'spam', 'NIU', 'spam']
>>> L.count('spam') #计算指定元素的个数
2
>>> L.reverse() #反转
>>> L
['spam', 'NIU', 'spam', 123]
>>> M = [1, 5, 6, 2, 0, 3]
>>> M.sort() #排序
>>> M
[0, 1, 2, 3, 5, 6]
嵌套
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] #取第一行第二个元素(从0开始算起)
6
列表解析
处理序列的操作和列表的方法中,Python还包括了一个更高级的操作,称为列表解析表达式。它提供了一种处理矩阵这样结构的强大工具,例如,我们要从矩阵中取出第二列:
# M = 1,2,3
# 4,5,6
# 7,8,9
>>> col2 = [row[1] for row in M] #收集第二列
>>> col2
[2, 5, 8]
>>> M
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] #元列表未改变
实际上操作的含义是:使用for循环遍历M,row变量为每一行,再取出每一行的第一个元素。
把矩阵M的每个row中的row[1],放在一个新的列表中。其结果就是一个包含了矩阵的第二列的新列表。
列表解析源自集合的概念,它是一种通过对序列中的每一项运行一个表达式来创建一个新序列的方法,每次一个,从左至右。列表解析是编写在方括号中的(提醒你在创建列表这个事实),并且由使用了同一个变量名的(这里是row)表达式和循环结构组成。
更复杂一些:
>>> M
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> [row[1] + 1 for row in M] #取出元素+1
[3, 6, 9]
>>> [row[1] for row in M if row[1] % 2 == 0] #取出偶数
[2, 8]
列表解析创建了新的列表作为结果,但是能够在任何可迭代的对象上进行迭代。例如,这里我们将会使用列表解析去步进最表的一个硬编码列表和一个字符串。
>>> diag = [M[i][i] for i in [0, 1, 2]] #遍历数组,得到0,1,2 赋值给i
>>> diag
[1, 5, 9]
>>> doubles = [c * 2 for c in 'spam'] #重复字符串
>>> doubles
['ss', 'pp', 'aa', 'mm']
解析缘分可以用来创建产生所需结果的生成器(例如内置的sum函数,按照一种顺序汇总各项):
>>> G = (sum(row) for row in M) #返回的是迭代器类型
>>> next(G)
6
>>> next(G)
15
>>> next(G)
24
内置函数map可以做类似的事情,产生对各项运行一个函数的结果:
>>> list(map(sum,M))
[6, 15, 24]
解析语法也可以用来创建列表、集合和字典:
>>> {sum(row) for row in M} #创建集合
{24, 6, 15}
>>> {i : sum(M[i]) for i in range(3)} #创建字典
{0: 6, 1: 15, 2: 24}
>>> [ord(x) for x in 'spaam'] #获取每个字符的ASCII码,集成一个list
[115, 112, 97, 97, 109]
>>> {ord(x) for x in 'spaam'} #获取每个字符的ASCII码,集成一个set
{112, 97, 115, 109}
>>> {x : ord(x) for x in 'spaam'} #获取每个字符的ASCII码,集成一个字典
{'s': 115, 'p': 112, 'a': 97, 'm': 109}