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 06 Python
python使用wxpython开发简单记事本的方法
May 20 Python
Python中 Lambda表达式全面解析
Nov 28 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
通过实例解析python描述符原理作用
Jan 22 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
python 模块导入问题汇总
Feb 01 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 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中的一些数组排序方法分享
2012/07/20 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
2009/07/19 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
Python简单进程锁代码实例
2015/04/27 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
Python六大开源框架对比
2015/10/19 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
应用服务器有那些
2012/01/19 面试题
explicit和implicit的含义
2012/11/15 面试题
超市5.1促销活动
2014/01/15 职场文书
财经学院自荐信范文
2014/02/02 职场文书
创先争优公开承诺书
2014/08/30 职场文书
生产操作工岗位职责
2014/09/16 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android