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通过exifread模块获得图片exif信息的方法
Mar 16 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
Python使用Phantomjs截屏网页的方法
May 17 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
python 实现数字字符串左侧补零的方法
Dec 04 Python
python根据txt文本批量创建文件夹
Dec 08 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
python 实现多线程下载视频的代码
Nov 15 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
pycharm下pyqt4安装及环境配置的教程
Apr 24 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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
ThinkPHP路由详解
2015/07/27 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
js 自定义个性下拉选择框示例
2013/08/20 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Python中类的初始化特殊方法
2017/12/01 Python
Django视图和URL配置详解
2018/01/31 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
Unix如何添加新的用户
2014/08/20 面试题
本科毕业生自我鉴定
2013/11/02 职场文书
汉语言文学职业规划
2014/02/14 职场文书
英语教师岗位职责
2014/03/16 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
企业安全标语
2014/06/07 职场文书
亮剑观后感300字
2015/06/05 职场文书
男方家长婚礼致辞
2015/07/27 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript
Win2008系统搭建DHCP服务器
2022/06/25 Servers