F1 列表的特定类型操作
1.Python的列表与其他语言的数组类似但是强大的多,因为列表没有固定类型的约束。
2.列表没有固定大小,我们可以按需要进行增加或减小列表大小。
>>>L=[1,'ab',1.23]
>>>L.append('qx')
>>>L
[1, 'ab', 1.23, 'qx']
>>>L.pop(0)
1
>>>L
['ab', 1.23, 'qx']
>>>L.pop(-1)
'qx'
>>>L
['ab', 1.23]
上例列表类型有3种 特定类型操作都是对象后面加点调用 .append(),.pop(这里是偏移量)
3.其他列表方法 insert remove extend
4.因为列表可变,大多数列表方法都会原位置改变列表对象,而不是创建一个新的列表 与字符 数字不同
>>>M=['b','c','a']
>>>M.sort()
>>>M
['a', 'b', 'c']
>>>M.reverse()
>>>M
['c', 'b', 'a']
都是在原位置进行了改变,直接改变了原列表
S2 边界检查
1.尽管列表没有固定大小,Python仍不允许引用不存在的元素 ,超出列表末尾之外的索引会返回错误,对列表末尾范围之外的赋值也会返回错误
>>>M=[1,2,3]
>>>M[5]
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: list index out of range
>>>M[5]=1
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: list assignment index out of range
2.在Python中并不是默默的增大列表作为响应而是会提示错误,为了让一个列表增大,可以调用append这个列表特定方法
T3 嵌套
1.Python核心数据类型的一个优秀特性是支持任意嵌套,能够以任意组合对进行嵌套,还可以多个层次进行嵌套 例如能够让一个列表包含一个字典 让这个字典包含另一个列表
2.
>>>M=[[1,2,3],[2,3,4],[3,4,5]]
>>>M
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
>>>M[0][0]
1
>>>M[1][2]
4
列表嵌套实现矩阵赋值
F4 推导 高级操作 列表推到表达式
1.例如上矩阵例提取某一行是简单的,但是提取某一列需要借助循环,但是通过列表推导表达式可以方便的直接提取
>>>M
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
>>>A=[row[0] for row in M]
>>>A
[1, 2, 3]
>>>A=[row[1] for row in M]
>>>A
[2, 3, 4]
看懂的方式是从后往前看 inM: M中 for row: 每一行 row[1] 的第二个元素
2.列表推导源自数学中集合的概念,本质是通过对 序列(不止限于列表) 中的每一项运行一个表达式来创建一个新列表的方法,每次一个,从左至右
3.列表推导是编写在方括号中的(提醒你在创建一个新列表方法)
4.列表推导使用同一个变量名的表达式和循环结构组成
更复杂的操作 提取对角线元素
>>>M=[[1,2,3],[2,3,4],[3,4,5]]
>>>M
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
>>>diag=[M[x][x] for x in [0,1,2]]
>>>diag
[1, 3, 5]
只提取第一列中偶数元素
>>>M=[[1,2,3],[2,3,4],[3,4,5]]
>>>B=[row[0] for row in M if row[0]%2==0]
>>>B
[2]
第一列值加1
>>>M=[[1,2,3],[2,3,4],[3,4,5]]
>>>B=[row[0]+1 for row in M]
>>>B
[2, 3, 4]
列表推导表达式针对非列表如字符串(序列都可以) 但返回根据你是用的是方括号 还是花括号 还是括号
>>>Q=[2*c for c in 'love']
>>>Q
['ll', 'oo', 'vv', 'ee']
5. 内置函数range() 配合list()生成列表
>>>list(range(-8,6,2))
[-8, -6, -4, -2, 0, 2, 4]
前面(-8,6)表示的集合实际上是左闭右开的 幅度为2 最后一个参数
>>>[[x**2,x**3] for x in range(4)]
[[0, 0], [1, 1], [4, 8], [9, 27]]
>>>[x**2 for x in list(range(4))]
[0, 1, 4, 9]
>>>[x**2 for x in range(4) if (x**2)%2==0]
[0, 4]
range()函数在列表推到表达式中不需要加list()
6.列表推到是一个可选的特性
7.列表推导 更一般的用法 不仅仅是生成列表,括号中的推到语法可以用来创建产生所需结果的生成器
>>>M=[[1,2,3],[2,3,4],[3,4,5]]
>>>G=(sum(row) for row in M)
>>>next(G)
6
>>>next(G)
9
>>>next(G)
12
8. 内置map(a,b) a 是一个函数 作用到b的每一个对象上
>>>M=[[1,2,3],[2,3,4],[3,4,5]]
>>>list(map(sum,M))
[6, 9, 12]
9.推导语法也可以用来创建集合和字典
>>>M=[[1,2,3],[2,3,4],[3,4,5]]
>>>{sum(row) for row in M}
{9, 12, 6}
>>>{i:sum(M[i]) for i in range(3)}
{0: 6, 1: 9, 2: 12}
10.实际上,列表 集合 字典 生成器 都可以用 推导语法来创建
>>>[ord(x) for x in 'love']
[108, 111, 118, 101]
>>>[ord(x) for x in 'I love you']
[73, 32, 108, 111, 118, 101, 32, 121, 111, 117]
>>>{ord(x) for x in 'I love you'}
{32, 101, 73, 108, 111, 117, 118, 121}
>>>{x:ord(x) for x in 'I love you' }
{'I': 73, ' ': 32, 'l': 108, 'o': 111, 'v': 118, 'e': 101, 'y': 121, 'u': 117}
>>>(ord(x) for x in 'love' )
<generator object <genexpr> at 0x000001C1D60FA820>
内置函数ord()返回对应字符的ASCII码
注意 集合 与 字典 没有左右相对顺序 且 会将相同元素只保留一个 其他 都去掉