概述
Python的容器相关类
绝大部分编程语言通常会提供的4中主流的数据结构是list
、set
、dict
和deque
。
其中,set
集合无法记住添加这个元素的顺序,set里面的元素不能重复;list
容器可以记住每次添加元素的顺序,因此程序可通过索引来存取元素,list容器的元素允许重复;dict
容器里面的每项数据都由key-value
对组成,因此程序可通过key
来存取value
;deque
则代表一个双端队列,双端队列的特征是它的两端都可以添加、删除元素,它既可作为栈(stack
)使用,也可作为队列(queue
)使用。
一、set和fronset
set
集合有两个特征:set
不记录元素的添加顺序;元素不允许重复。
set
集合是可变容器,程序可以改变容器的元素。与set
对应的还有frozenset
集合,它是set
的不可变版本,元素是不可变的。
set
集合的方法的用法实例如下:
## 1.使用花括号构建set集合
c = {'元素1'}
## 2.添加元素
c.add("元素2")
c.add(7)
print('c集合为:',c,' c集合个数:',len(c))
# c集合为: {'元素1', '元素2', 7}
c集合个数: 3
## 3.删除元素
c.remove(7)
print('c集合为:',c)
# c集合为: {'元素1', '元素2'}
## 4.使用set()函数(构造器)来创建set集合
books = set()
books.add('b1')
books.add('b2')
print('books集合为:',books)
# books集合为: {'b1', 'b2'}
## 5.使用issubset()方法或者<=运算符 判断是否为子集
books1 = {'b1'}
print(books1.issubset(books)) #True
print(books1 <= books) #True
## 6.使用issuperset()方法或者>=运算符 判断是否为父集
print(books1.issuperset(books)) #True
print(books1 >= books) #True
## 7.使用 - 或者difference()方法,用前面的set集合减去后面的set集合的元素
## 不改变books集合里的元素
result1 = books - books1
print(result1) # {'b2'}
result2 = books.difference(books1)
print(result2) # {'b2'}
## 改变books集合里的元素
books.difference_update(books1)
print(books) # {'b2'}
## 8.用& 或者intersection()方法,获取两个set集合的交集
## 不改变原来集合
tvs1 = {'t1','t2','t3'}
tvs2 = {'t2','t3','t4'}
inter1 = tvs1 & tvs2
print(inter1)
# {'t3', 't2'}
inter2 = tvs1.intersection(tvs2)
print('inter2:',inter2,' tvs1',tvs1)
# inter2: {'t3', 't2'}
tvs1 {'t3', 't1', 't2'}
## 改变原来集合
tvs1.intersection_update(tvs2)
print(tvs1)
# {'t3', 't2'}
## 9.用^ 计算两个集合异或的结果,就是用两个集合的并集减去交集的元素
tvs1 = {'t1','t2','t3'}
tvs2 = {'t2','t3','t4'}
xor = tvs1 ^ tvs2
print(xor)
# {'t4', 't1'}
##10.计算两个集合的并集
## 不改变集合的元素
un = tvs1.union(tvs2)
print(un)
# {'t3', 't1', 't2', 't4'}
## 改变集合的元素
tvs1.update(tvs2)
print(tvs1)
# {'t3', 't1', 't2', 't4'}
frozenset
是set
的不可变版本,可使用set
集合中不改变集合本身的方法。
二、双端队列(deque)
栈是一种后进先出(LIFO)的线性表,队列是一种先进先出(FIFO)的线性表。
对于一个双端队列
来说,它可以从两端分别进行插入、删除操作。如果程序将所有的插入、删除操作都固定在一端进行,那么这个双端队列就变成了栈
;如果固定在一端只添加元素,在另一端只删除元素,那么它就变成了队列
。因此,deque
既可被当成队列使用,也可被当成栈使用。
>>> from collections import deque
>>> [e for e in dir(deque) if not e.startswith('_')]
['append', 'appendleft', 'clear', 'copy', 'count', 'extend', 'extendleft', 'index', 'insert', 'maxlen', 'pop', 'popleft', 'remove', 'reverse', 'rotate']
deque
的左边(left)就相当于它的队列头(front),右边(right)就相当于它的队列尾(rear)。
1. append
和appendleft
:在deque
的右边或左边添加元素,也就是默认在队列尾添加元素。
2. pop
和popleft
:在deque
的右边或左边弹出元素,也就是默认在队列尾弹出元素。
3. extend
和extendleft
:在deque
的右边或左边添加多个元素,也就是默认在队列尾添加多个元素。
4. deque
中的clear()
方法用于清空队列;insert()
方法则是线性表的方法,用于指定位置插入元素。
三、Python的堆操作
Python并没有提供“堆”这种数据类型,它是直接把列表当成堆处理。Python提供的heapq
包中有一些函数,当程序用这些函数来操作列表时,该列表会表现出“堆”的行为。
Python提供的是基于小顶堆的操作,因此Python可以对list
中的元素进行小顶堆排序,这样程序每次获取堆中元素时,总会取得堆中最小的元素。
>>> import heapq
>>> heapq.__all__
['heappush', 'heappop', 'heapify', 'heapreplace', 'merge', 'nlargest', 'nsmallest', 'heappushpop']
堆操作的示例代码如下:
from heapq import *
my_data = list(range(10))
my_data.append(0.5)
print('my_data的元素:', my_data)
# my_data的元素: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0.5]
## 对my_data应用堆属性
heapify(my_data)
print('应用堆之后my_data的元素:', my_data)
# 应用堆之后my_data的元素: [0, 0.5, 2, 3, 1, 5, 6, 7, 8, 9, 4]
## 将元素7.2推入堆后
heappush(my_data, 7.2)
print(my_data)
# [0, 0.5, 2, 3, 1, 5, 6, 7, 8, 9, 4, 7.2]
## 弹出堆中最小元素
print(heappop(my_data))
# 0
print(heappop(my_data))
# 0.5
print('弹出两个元素后:', my_data)
# 弹出两个元素后: [1, 3, 2, 7, 4, 5, 6, 7.2, 8, 9]
## 弹出最小元素,压入指定元素
print(heapreplace(my_data, 8.1))
# 1
print('执行replace后my_data的元素:', my_data)
# 执行replace后my_data的元素: [2, 3, 5, 7, 4, 8.1, 6, 7.2, 8, 9]
## 取得堆中最大、最小的几个元素
print('my_data中最大的3个元素:',nlargest(3,my_data))
# my_data中最大的3个元素: [9, 8.1, 8]
print('my_data中最小的3个元素:',nsmallest(3,my_data))
# my_data中最小的3个元素: [2, 3, 4]
最后
以上就是健康小甜瓜为你收集整理的Python的容器相关类的全部内容,希望文章能够帮你解决Python的容器相关类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复