1. 关于列表更多的内容
Python 的列表数据类型包含更多的方法。这里是所有的列表对象方法:
list.``append(x)
把一个元素添加到列表的结尾,相当于a[len(a):] = [x]
list.``extend(L)
将一个给定列表中的所有元素都添加到另一个列表中,相当于a[len(a):] = L。
list.``insert(i, x)
在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如a.insert(0, x)会插入到整个列表之前,而a.insert(len(a), x)相当于a.append(x)。
list.``remove(x)
删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。
list.``pop([i])
从列表的指定位置删除元素,并将其返回。如果没有指定索引,a.pop() 返回最后一个元素。元素随即从列表中被删除(方法中 i 两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在Python 库参考手册中遇到这样的标记)。
list.``clear()
从列表中删除所有元素。相当于del a[:]
list.``index(x)
返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。
list.``count(x)
返回 x 在列表中出现的次数。
list.``sort()
对列表中的元素就地进行排序。
list.``reverse()
就地倒排列表中的元素。
list.``copy()
返回列表的一个浅拷贝。等同于a[:]。
下面这个示例演示了列表的大部分方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
也许大家会发现像insert,remove或者sort这些修改列表的方法没有打印返回值–它们返回None。 [1] 在 python 中对所有可变的数据类型这是统一的设计原则。
1.1. 把列表当作堆栈使用
列表方法使得列表可以很方便的做为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用append()方法可以把一个元素添加到堆栈顶。用不指定索引的pop()方法可以把一个元素从堆栈顶释放出来。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1.2. 把列表当作队列使用
你也可以把列表当做队列使用,队列作为特定的数据结构,最先进入的元素最先释放(先进先出)。不过,列表这样用效率不高。相对来说从列表末尾添加和弹出很快;在头部插入和弹出很慢(因为,为了一个元素,要移动整个列表中的所有元素)。
要实现队列,使用collections.deque,它为在首尾两端快速插入和删除而设计。例如:
1 2 3 4 5 6 7 8 9 10 |
|
1.3. 列表推导式
列表推导式为从序列中创建列表提供了一个简单的方法。普通的应用程式通过将一些操作应用于序列的每个成员并通过返回的元素创建列表,或者通过满足特定条件的元素创建子序列。
例如, 假设我们创建一个squares列表,可以像下面方式:
1 2 3 4 5 6 |
|
注意这个 for 循环中的被创建(或被重写)的名为 x 的变量在循环完毕后依然存在。使用如下方法,我们可以计算squares的值而不会产生任何的副作用:
1 |
|
或者,等价于:
1 |
|
上面这个方法更加简明且易读.
列表推导式由包含一个表达式的括号组成,表达式后面跟随一个for子句,之后可以有零或多个for或if子句。结果是一个列表,由表达式依据其后面的for和if子句上下文计算而来的结果构成。
例如,如下的列表推导式结合两个列表的元素,如果元素之间不相等的话:
1 2 |
|
等同于:
1 2 3 4 5 6 7 8 |
|
值得注意的是在上面两个方法中的 for 和 if 语句的顺序。
如果想要得到一个元组(例如,上面例子中的 (x, y)),必须要加上括号:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
列表推导式可使用复杂的表达式和嵌套函数:
1 2 3 |
|
1.4. 嵌套的列表推导式
列表解析中的第一个表达式可以是任何表达式,包括列表解析。
考虑下面由三个长度为 4 的列表组成的 3x4 矩阵:
1 2 3 4 5 |
|
现在,如果你想交换行和列,可以用嵌套的列表推导式:
1 2 |
|
像前面看到的,嵌套的列表推导式是对 for 后面的内容进行求值,所以上例就等价于:
1 2 3 4 5 6 |
|
反过来说,如下也是一样的:
1 2 3 4 5 6 7 8 9 10 |
|
在实际中,你应该更喜欢使用内置函数组成复杂流程语句。对此种情况 zip() 函数将会做的更好:
1 2 |
|
更多关于本行中使用的星号的说明,参考 参数列表的分拆。
2. del 语句
有个方法可以从列表中按给定的索引而不是值来删除一个子项:del语句。它不同于有返回值的pop()方法。语句del还可以从列表中删除切片或清空整个列表(我们以前介绍过一个方法是将空列表赋值给列表的切片)。例如:
1 2 3 4 5 6 7 8 9 10 |
|
del 也可以删除整个变量:
1 |
|
此后再引用命名 a 会引发错误(直到另一个值赋给它为止)。我们在后面的内容中可以看到del的其它用法。
3. 元组和序列
我们知道列表和字符串有很多通用的属性,例如索引和切割操作。它们是 序列 类型(参见Sequence Types — list, tuple,range)中的两种。因为Python是一个在不停进化的语言,也可能会加入其它的序列类型,这里介绍另一种标准序列类型: 元组 。