我是靠谱客的博主 健康小甜瓜,最近开发中收集的这篇文章主要介绍Python的容器相关类,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Python的容器相关类

绝大部分编程语言通常会提供的4中主流的数据结构是listsetdictdeque

其中,set集合无法记住添加这个元素的顺序,set里面的元素不能重复;list容器可以记住每次添加元素的顺序,因此程序可通过索引来存取元素,list容器的元素允许重复;dict容器里面的每项数据都由key-value对组成,因此程序可通过key来存取valuedeque则代表一个双端队列,双端队列的特征是它的两端都可以添加、删除元素,它既可作为栈(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'}

frozensetset的不可变版本,可使用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. appendappendleft:在deque的右边或左边添加元素,也就是默认在队列尾添加元素。
2. poppopleft:在deque的右边或左边弹出元素,也就是默认在队列尾弹出元素。
3. extendextendleft:在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的容器相关类所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部