查漏补缺(二)---列表与元组
2.2.1 索引
序列中的所有元素都是有编号的——从0开始递增。这些元素可以通过编号分别访问,如下例所示:
>>>greeting='Hello' >>>greeting[0] 'H'
字符串字面值(就此而言,其他序列字面量亦可)能够直接使用索引
>>>'Hello'[1] 'e'
2.2.2 分片
编号在这里尤为重要:
第1个索引是要提取的第1个元素的编号,而最后的索引则是分片之后剩余部分的第1个元素的编号:
>>>numbers=[1,2,3,4,5,6,7,8,9,10] >>>numbers[3:6] [4,5,6] >>>numbers[0:1] [1]
1.优雅的捷径
假设需要访问最后3个元素(先前的例子),那么当然可以进行显示的操作:
>>>numbers[7:10]
[8,9,10]
索引10指向的是第11个元素——这个元素并不存在,却是在最后一个元素之后。即为了让分片部分能够包含列表的最后一个元素,必须提供最后一个元素的下一个元素所对应的索引作为边界。
>>>numbers[-3:-1] [8,9,10] >>>numbers[-3:] [8,9,10]
2.更大的步长
>>>numbers[0:10:2]
[1,3,5,7,9]
步长可以是复数,但不可以为0.
2.2.3 序列相加
两种相同类型的序列才能进行连接操作
2.2.4 乘法
用数字 x 乘以一个序列会生成新的序列,而在新的序列中,原来的序列将被重复 x 次:
>>>'python'*5 'pythonpythonpythonpythonpython' >>>[42]*10 [42,42,42,42,42,42,42,42,42,42]
2.3 列表:Python 的“苦力”
2.3.1 list 函数
因为字符串不能像列表一样被修改,所以有时候根据字符串创建列表会很有用。list可以实现这个功能:
>>>list('Hello') ['H','e','l','l','o']
PS:list函数适用于所有类型的序列,而不只是字符串
2.3.2 基本的列表操作
1.改变列表:元素赋值
2.删除元素:从列表删除元素也很容易:使用del语句实现:
>>>names=['Alice','Beth','Cecil','Dee-Dee','Earl'] >>>del names[2] >>>names ['Alice','Beth','Dee-Dee','Earl']
3.分片赋值
2.3.3 列表方法
1.append
2.count
count方法统计某个元素在列表中出现的次数:
>>>['to','be','or','not','to','be'].count('to') 2 >>>x=[[1,2],1,1,[2,1,[1,2]]] x.count(1) 2
3.extend
extend方法可以在列表的末尾一次性追加另一个序列中的多个值。换句话说,可以用新列表扩展原有的列表:
>>>a=[1,2,3] >>>b=[4,5,6] >>>a.extend(b) >>>a [1,2,3,4,5,6]
4.index
index方法用于从列表中找出某个值第一个匹配项的索引位置:
>>>knights=['we','are','knights','who','say','in'] >>>knights.index('who') 4
5.insert
>>>numbers=[1,2,3,5,6,7] >>>numbers.insert(3,'four') >>>numbers [1,2,3,'four',5,6,7]
6.pop
pop方法会移除列表中的一个元素(默认是最后一个),并且返回该元素的值:
>>>x=[1,2,3] >>>x.pop() 3 >>>x [1,2] >>>x.pop(1) >>>x [2]
pop方法是唯一一个既能修改列表又返回元素值(除了None)的列表方法
使用pop方法可以实现一种常见的数据结构——栈。栈的原理就像堆放盘子那样。只能在顶部放一个盘子,同样,也只能从顶部拿走一个盘子。最后被放入堆栈的最先被移出
(LIFO后进先出)‘
对于上述两个栈操作(放入和移除),它们有大家都认可的称谓——入栈(push)和出栈(pop)。Python没有入栈方法,但可以使用append方法来代替。pop方法和append方法的操作结果恰好相反,如果入栈(或者追加)刚刚出栈的值,最后得到的结果还是原来的栈。
>>>x=[1,2,3] >>>x.append(x.pop()) >>>x [1,2,3]
PS:实现先进先出(FIFO)的队列(queue),那么可以使用insert(0,..)来代替append方法。或者,继续使用append方法,但必须使用pop(0)来代替pop()。更好的解决方案是使用collection模块中的deque对象。
7.remove :用于移除列表中某个值的第一个匹配项
8.reverse:将列表中的元素反向存放
PS:对一个序列进行反向迭代,那么可以使用reversed函数。这个函数返回的是一个迭代器(iterator)对象,使用list函数把返回的对象转换成列表
>>>x=[1,2,3] >>>list(reversed(x)) [3,2,1]
9.sort
前面介绍过几个改变列表却不返回值的方法,在大多数情况下这样的行为方式是很合常理的(例如append)。但是,当用户需要一个排好序的列表副本,同时又保留原有列表不变的时候,问题出现了:
>>>x=[4,6,2,1,7,9] >>>y=x.sort() #don't do this >>>print y None
sort方法修改了x却返回了空值,那么最后得到的是已排序的x以及值为None的y。实现这个功能的正确方法是,首先把x的副本赋值给y,然后对y进行排序:
>>>x=[4,6,2,1,7,9] >>>y=x[:] >>>y.sort >>>x [4,6,2,1,7,9] >>>y [1,2,4,6,7,9]
另一种获取已排序的列表副本的方法是,使用sorted函数:
>>>x=[4,6,2,1,7,9] >>>y.sorted(x) >>>x [4,6,2,1,7,9] >>>y [1,2,4,6,7,9]
sorted函数可以用于任何序列,却总是返回一个列表:
>>>sorted('Python') ['h','n','o','P','t','y']
10.高级排序
compare(x,y)函数会在 x < y 时返回负数,在 x > y 时返回正数,如果 x = y 则返回0
如果要根据元素的长度进行排序,那么可以使用len作为键函数:
>>>x=['aardvark','abalone','acme','add','aerate'] >>>x.sort(key=len) >>>x ['add','acme','aerate','abalone','aardvark'
sort方法有另外的两个可选的参数——key和reverse。
>>>x=[4,6,2,1,7,9] >>>x.sort(reverse=True) >>>x [9.7,1,2,6,4]
2.4 元组
>>>1,2,3 (1,2,3) >>>(1,2,3) (1,2,3) >>>() () >>>42, (42,) >>>3*(40+2,) (42,42,42)
2.4.1 tuple函数