Python3 数据结构
本章节我们主要结合前面所学的知识点来介绍Python数据结构。
列表
Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。
以下是 Python 中列表的方法:
方法 | 描述 |
---|---|
list.append(x) | 把一个元素添加到列表的结尾,相当于a[len(a):] = [x] |
list.extend(L) | 在list的结尾连接上另一个列表,相当于a[len(a): ] = L |
list.insert(i,x) | 在指定位置插入一个元素,第一个参数是即将被插入到该元素前面的元素索引。例如:a.insert(0,x) ,x会插入到整个列表之前。而a.insert(len(a),x),相当于a.append(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[:]。 |
下面示例演示了列表的大部分方法:
def ListMethod(newlist):
print('初始列表:',newlist)
#在结尾增加元素
a = 5
newlist.append(a)
print('结尾再增加元素:',newlist)
#在结尾增加列表
list2 = [11,12,13]
newlist.extend(list2)
print('结尾增加列表:',newlist)
#插入一个元素在位置2
b = 10
newlist.insert(2,b)
print('位置2前插入元素:',newlist)
#移除位置3的元素,没有参数则是移除并返回最后一个元素
c = newlist.pop(3)
print('删除位置3的元素:',newlist,'返回删除的元素:',c)
d = newlist.pop()
print('删除最后一个元素:',newlist,'返回删除的元素:',d)
#查找值为4的索引
e = 4
f = newlist.index(e)
print('列表:',newlist,'4在列表中的索引为:',f)
#返回2在列表中出现的次数
g = 2
h = newlist.count(g)
print('列表',newlist,'2在列表中出现的次数:',h)
#对列表进行排序
newlist.sort()
print('排序后的列表:',newlist)
#对列表进行倒排
newlist.reverse()
print('倒排后的列表,',newlist)
#复制一份列表(复制)
list3 = newlist.copy()
print('复制的列表:',list3)
#改变原列表的值,复制的列表值是否改变
newlist[0] = 20
print('复制的列表(源列表该值后):',list3)
#清空列表,移除列表所有项
newlist.clear()
print(newlist)
return newlist
mylist = [0,1,2,3,4]
mylist = ListMethod(mylist)
print(mylist)
以上程序的运行结果为:
注意:类似 insert, remove 或 sort 等修改列表的方法没有返回值。
将列表当做堆栈使用
列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。例如:
#py 堆栈 后进先出
stacklist = [1,2]
def EnterStack(value):
stacklist.append(value)
print(stacklist)
def OutStack():
value = stacklist.pop()
print(stacklist)
return value
print('入堆栈:')
#入堆栈
EnterStack(13)
EnterStack(14)
print('----------------------------')
print('出堆栈:')
#出堆栈
a = OutStack()
print('出堆栈元素:',a)
a = OutStack()
print('出堆栈元素:',a)
a = OutStack()
print('出堆栈元素:',a)
以上脚本运行结果:
将列表当作队列使用
也可以把列表当做队列用, 只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。
Python中的collentions中有一个deque,这个对象类似于list列表,但是使用list存储数据是,按索引访问元素很快,但是插入和删除就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
但是deque是为了实现插入和删除操作的双向列表,适用于队列和栈.
#py 队列 先进先出
from collections import deque
Queuelist = deque([1,2,3])
def EnterQueue(value):
Queuelist.append(value)
print(Queuelist)
def OutQueue():
value = Queuelist.popleft()
print(Queuelist)
return value
print('入队列:')
EnterQueue(10)
EnterQueue(11)
print('----------------------')
print('出队列:')
a = OutQueue()
print('出队列元素:',a)
a = OutQueue()
print('出队列元素:',a)
a = OutQueue()
print('出队列元素:',a)
以上脚本运行结果: