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之玩转字符串(2)更新篇
Sep 28 Python
Python文件与文件夹常见基本操作总结
Sep 19 Python
Python操作Excel之xlsx文件
Mar 24 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
python实现弹跳小球
May 13 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
python将字母转化为数字实例方法
Oct 04 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
Python基于Tensor FLow的图像处理操作详解
Jan 15 Python
使用AJAX和Django获取数据的方法实例
Oct 25 Python
python小技巧——将变量保存在本地及读取
Nov 13 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/01/10 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JS跨域问题详解
2014/11/25 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Django 框架模型操作入门教程
2019/11/05 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
公务员的自我鉴定
2013/10/26 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
学生会副主席竞选稿
2015/11/19 职场文书