查漏补缺(二)---列表与元组

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函数

posted on 2015-11-19 21:35  风靡oopp  阅读(242)  评论(0编辑  收藏  举报

导航