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中类的一些方法分析
Sep 25 Python
django项目运行因中文而乱码报错的几种情况解决
Nov 07 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
python正则表达式面试题解答
Apr 28 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
Python CSV文件模块的使用案例分析
Dec 21 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
解析python 类方法、对象方法、静态方法
Aug 15 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
Dec 07 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
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
浅析php单例模式
2014/11/25 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
node.js入门教程
2014/06/01 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
python3 读取Excel表格中的数据
2018/10/16 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
浅析Python迭代器的高级用法
2020/07/16 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
应届大学生求职信
2013/12/01 职场文书
季度思想汇报
2014/01/01 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
计划生育证明书写要求
2014/09/17 职场文书
婚内房产协议书范本
2014/10/02 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL