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中使用PIPE操作Linux管道
Feb 04 Python
python通过shutil实现快速文件复制的方法
Mar 14 Python
Python 遍历子文件和所有子文件夹的代码实例
Dec 21 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
将Django项目部署到CentOs服务器中
Oct 18 Python
pandas按行按列遍历Dataframe的几种方式
Oct 23 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
Python装饰器结合递归原理解析
Jul 02 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 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框架系列文章(6)mysql数据库方法
2016/03/04 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
2013/12/24 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
vue 实现图片懒加载功能
2020/12/31 Vue.js
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
详谈python read readline readlines的区别
2017/09/22 Python
python 获取字符串MD5值方法
2018/05/29 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
python 为什么说eval要慎用
2019/03/26 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
汉语言文学毕业生求职信
2013/10/01 职场文书
《问银河》教学反思
2014/02/19 职场文书
会计自荐信范文
2014/03/09 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
家长会欢迎标语
2014/06/24 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
技术股份合作协议书
2014/10/05 职场文书
羊脂球读书笔记
2015/06/30 职场文书
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python