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有证书的加密解密实现方法
Nov 19 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
python如何实现代码检查
Jun 28 Python
python实现共轭梯度法
Jul 03 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
Python绘图实现显示中文
Dec 04 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
bat批处理之字符串操作的实现
Mar 16 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小技巧之过滤ascii控制字符
2014/05/14 PHP
浅谈php命令行用法
2015/02/04 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
ie支持function.bind()方法实现代码
2012/12/27 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
详解node中创建服务进程
2017/05/09 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
Farnell德国:电子元器件供应商
2018/07/10 全球购物
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
中国旅游网站:途牛旅游网
2019/09/29 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
医院办公室主任职责
2013/12/29 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python