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基于动态规划算法计算单词距离
Jul 25 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
Python查找文件中包含中文的行方法
Dec 19 Python
django框架防止XSS注入的方法分析
Jun 21 Python
Python3 执行Linux Bash命令的方法
Jul 12 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
Python学习笔记之函数的定义和作用域实例详解
Aug 13 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
Python日期格式和字符串格式相互转换的方法
Feb 18 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
Nov 11 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在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
2011/07/17 PHP
PHP防止跨域提交表单
2013/11/01 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
php将html转为图片的实现方法
2017/05/19 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
js 表单验证方法(实用)
2009/04/28 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
2014/03/27 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
几行js代码实现自适应
2017/02/24 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
Python中操作mysql的pymysql模块详解
2016/09/13 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
详解tensorflow实现迁移学习实例
2018/02/10 Python
PyTorch基本数据类型(一)
2019/05/22 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
详解Flask前后端分离项目案例
2020/07/24 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
导师评语大全
2014/04/26 职场文书
上海世博会口号
2014/06/19 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
通知怎么写?
2019/04/17 职场文书
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js