1.6 写一个列表
列表是一种顺序型的容器对象,它和元组很相似,不过,它们是同构且是可变的。列表支持追加操作,它可以被用来当作栈或者队列。与元组不同,它可以扩展,你可以在创建一个列表之后使用append函数给它追加一个元素。
1.6.1 准备工作
和介绍元组的小节相似,我们通过一些小段的代码来聚焦于列表的创建与维护操作,而不是像介绍字典那样采用完整的功能代码。
1.6.2 操作方法
下面的Python代码演示列表的创建和维护等操作。
# 1.快速地创建一个列表
a = range(1,10)
print a
b = ["a","b","c"]
print b
# 2.列表可以通过索引来访问,索引起始于0
print a[0]
# 3.用负数作为索引,则对列表元素的访问从反方向开始
a[-1]
# 4.使用两个索引参数,切片操作可以访问列表的子集
print a[1:3] # prints [2, 3]
print a[1:] # prints [2, 3, 4, 5, 6, 7, 8, 9]
print a[-1:] # prints [9]
print a[:-1] # prints [1, 2, 3, 4, 5, 6, 7, 8]
# 5.列表串联
a = [1,2]
b = [3,4]
print a + b # prints [1, 2, 3, 4]
# 6.列表的最小值和最大值
print min(a),max(a)
# 7.包含于和非包含于
if 1 in a:
print "Element 1 is available in list a"
else:
print "Element 1 is available in tuple a"
# 8.追加和扩展列表
a = range(1,10)
print a
a.append(10)
print a
# 9.列表实现栈
a_stack = []
a_stack.append(1)
a_stack.append(2)
a_stack.append(3)
print a_stack.pop()
print a_stack.pop()
print a_stack.pop()
# 10.列表实现队列
a_queue = []
a_queue.append(1)
a_queue.append(2)
a_queue.append(3)
print a_queue.pop(0)
print a_queue.pop(0)
print a_queue.pop(0)
# 11.列表排序和反转
from random import shuffle
a = range(1,20)
shuffle(a)
print a
a.sort()
print a
a.reverse()
print a
1.6.3 工作原理
第1步中,我们能看到创建列表的方式与其他的不同,请注意我们只有同类型的元素。和集合不一样,列表允许存在重复的元素。第2步到第7步和元组的相关步骤都是一样的,覆盖了索引、切片、串联、最小最大值、包含于和非包含于等操作,我们不再赘述。
第8步演示了追加和扩展操作,这也是列表区别于元组的地方(当然,请注意列表元素必须是同类型)。我们来看看代码第1部分的输出。
>>> a = range(1,10)
>>> print a
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a.append(10)
>>> print a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>
我们看到10被添加到列表a中。
下面的输出是第2部分中扩展函数的演示。
>>> b=range(11,15)
>>> a.extend(b)
>>> print a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>>
我们用另一个列表b扩展了原来的列表。
在第9步中,我们演示了用列表实现栈的功能,pop()函数用来取回追加到列表中的最后一个元素,输出结果如下。
3
2
1
最后一个被追加进来的元素被第一个取回,这就是栈的后进先出(Last In First Out,LIFO)。
在第10步,我们用列表来实现队列,pop()函数用0作为参数,表明要取出的元素的索引已经被传递了,输出结果如下。
1
2
3
输出结果遵循的是队列的FIFO类型,但这是一种低效的方法。由于列表底层实现的方法限制,弹出最初的元素不是一个好的选择。如果想要执行这个操作,一个更有效的方法是使用双端队列数据结构,我们将在下一章节中介绍。
最后一个步骤展示了列表的sort和reverse操作。列表的内置函数sort()可以将列表的元素进行排序,默认是升序排序。本章后面有个专门的小节讲解排序。reverse()函数将列表中的元素进行反转。
我们先来创建一个列表,元素是从1到19。
a = range(1,20)
random模块中有一个shuffle()函数,我们先用它将列表中的元素搅乱,然后我们才能演示排序操作,搅乱后的输出结果如下。
[19, 14, 11, 12, 4, 13, 17, 5, 2, 3, 1, 16, 8, 15, 18, 6, 7, 9, 10]
现在,a.sort()执行了一个位置排序,我们得到如下的输出结果。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
reverse()也是一个位置操作,产生如下输出结果。
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
1.6.4 更多内容
栈或队列只能在一个方向上追加或弹出数据,而双端队列有两个端,可以在不同的端执行追加或弹出数据操作,请参见:
https://docs.python.org/2/library/collections.html#collections.deque。