python中常用的数据结构介绍


Posted in Python onJanuary 12, 2021

# 使用List作为栈
stack = [3, 4, 5]

# 入栈
stack.append(6)
# 出栈
val = stack.pop()
# 栈定元素
val = stack[-1]

队列

队列是FIFO, 但是List对于First Out效率不够高。通常用双端队列Deque来实现队列

Deque的特点是,两端添加和删除都是O(1)的时间复杂度

from collections import deque
queue = deque(["Eric", "John", "Michael"])

# 入队列
queue.append("Terry")
# 出队列
queue.popleft()

元组

与List非常相似,但是Tuple是不可变的数据结构

# 创建, 等号右边可以用括号扩起来
empty = ()
xyz = 12345, 54321, 'hello!'
one = 12345,
## Unpacking
x, y, z = xyz
x, = one

Tuple内部是可以有List这样可变的元素的

a = [1,2,3]
b = [4,5,6]
# 创建, 等号右边可以用括号扩起来
t = (a, b) 
# ([1, 2, 3], [4, 5, 6])
a.append(4)
b.append(7)
print(t)
# ([1, 2, 3, 4], [4, 5, 6, 7])

如果Tuple足够满足,那么Tuple由以下两个优势:

  • 元组由于不可修改天然的线程安全
  • 元组在占用的空间上面都优于列表
import sys
t = tuple(range(2 ** 24))
l = [i for i in range(2 ** 24)]

# 比较内存使用
print(sys.getsizeof(t), sys.getsizeof(l))

Tuple创建方式

import timeit

# 从Range转换Tuple 这种速度最快,推荐此方法
timeit.timeit('''t = tuple(range(10000))''', number = 10000)

# 从List创建Tuple
timeit.timeit('''t = tuple([i for i in range(10000)])''', number = 10000)

# 从Range创建Tuple
timeit.timeit('''t = tuple(i for i in range(10000))''', number = 10000)

# Unpacking生成器创建Tuple
timeit.timeit('''t = *(i for i in range(10000)),''', number = 10000)

Range

序列数据结构(List, Tuple, Range)的一种, 常与For循环一起使用

# 0 - 9
val = range(10)
val = range(0, 10)
val = range(0, 10, 1)

集合

python中常用的数据结构介绍

empty = set()
a = {1, 2, 3, 3, 3, 2}
b = {1, 3, 5, 7, 9}

# 超集和子集
a <= b
a.issubset(b)
b.issuperset(a)

# 交集
intersection = a & b
# 并集
union = a | b
# 差
subtraction = a - b
# 对称差
symmetric_difference = a ^ b

字典

字典由(Key: Value)对组成,对于Key的要求是不可变类型(String, Number等),

所以Tuple可以作为Key,但是List却不行。

# {'sape': 4139, 'guido': 4127, 'jack': 4098}
d = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])

# {2: 4, 4: 16, 6: 36}
d = {x: x**2 for x in (2, 4, 6)}

# {'sape': 4139, 'guido': 4127, 'jack': 4098}
d = dict(sape=4139, guido=4127, jack=4098)

但是如果Tuple内包含可变类型,那么也不能作为Key, 会出现如下错误:

TypeError: unhashable type: 'list'

生成式

生成式(List Comprehensions)提供一种简洁的方式创建列表

# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 创建列表
squares = []
for x in range(10):
 squares.append(x**2)

# 生成式
squares = [x**2 for x in range(10)]

条件语句

# [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

使用函数

# ['3.1', '3.14', '3.142', '3.1416', '3.14159']
from math import pi
[str(round(pi, i)) for i in range(1, 6)]

生成式嵌套

matrix = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
]

# 行列
matrix = [[row[i] for i in range(len(row))] for row in matrix]

# 列行
transposed = [[row[i] for row in matrix] for i in range(4)]
transposed = list(zip(*matrix))

生成器

生成器与生成式语法相似,只是生成器是懒加载模式,不会立即生成整个列表

import sys
# 元素已经就绪,耗费较多的内存
l = [i for i in range(2 ** 24)] 
print(sys.getsizeof(l)) 
# 146916504 // 8 = 2 ** 24 

# 创建生成器对象, 不占用额外空间,但是需要数据的时候需要内部运算
l = (i for i in range(2 ** 24)) 
print(sys.getsizeof(l)) 
# 128

除了上面的生成器语法,还有一种就是通过yield关键字

def fib(n):
  a, b = 0, 1
  for _ in range(n):
    a, b = b, a + b
    yield a

if __name__ == '__main__':
  for val in fib(20):
    print(val)

循环

列表循环

l = ['tic', 'tac', 'toe']

for index in range(len(l))
 print(index, l[index])

for val in l:
 print(val)

for index, val in enumerate(l):
 print(index, val)

字典循环

d = {'gallahad': 'the pure', 'robin': 'the brave'}

for key in d:
 print(key, d[key])

for key, val in d.items():
 print(key, val)

reversed

# [0, 2, 4, 6, 8]
for num in range(0, 10, 2):
 print(num)

# [8, 6, 4, 2, 0]
for num in reversed(range(0, 10, 2)):
 print(num)

zip

返回Tuple的迭代器, 第i个元素来自于参数中每一个第i个元素, 长度等于最短的那个参数

以上就是python中常用的数据结构介绍的详细内容,更多关于python 数据结构的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python使用PyGreSQL操作PostgreSQL数据库教程
Jul 30 Python
Python实现的下载8000首儿歌的代码分享
Nov 21 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
python编程开发之textwrap文本样式处理技巧
Nov 13 Python
Python+matplotlib+numpy绘制精美的条形统计图
Jan 02 Python
使用python 3实现发送邮件功能
Jun 15 Python
Python发送邮件功能示例【使用QQ邮箱】
Dec 04 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
Python3爬虫关于识别点触点选验证码的实例讲解
Jul 30 Python
Python使用openpyxl批量处理数据
Jun 23 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 #Python
python3 kubernetes api的使用示例
Jan 12 #Python
python excel和yaml文件的读取封装
Jan 12 #Python
python drf各类组件的用法和作用
Jan 12 #Python
Python try except else使用详解
Jan 12 #Python
python 逆向爬虫正确调用 JAR 加密逻辑
Jan 12 #Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 #Python
You might like
PHP通用检测函数集合
2006/11/25 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
python中__call__方法示例分析
2014/10/11 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
python 实现倒排索引的方法
2018/12/25 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
会计岗位职责范本
2014/03/07 职场文书
初一学生评语大全
2014/04/24 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
公司聚餐通知
2015/04/22 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL