Python的数据结构
Python内置的数据结构
Python语言简洁明了,可以用较少的代码实现同样的功能。这其中Python内置的数据结构(可以统称为容器container)功不可没,主要是序列、映射以及集合三类主要的容器,最常用的为以下四个子类:
- list
- tuple
- dict
- set
序列Sequence
- list:列表,有序的 可变 序列
- tuple:元组,有序的 不可变 序列
- str:字符组成的 有序的 不可变 序列,字符可使用编码来理解
- bytes:字节组成的 有序的 不可变 序列
- (区别:字符串是字符组成的序列,以一个字符为单位;字节序列是字节组成的序列,以字节为单位)
- bytearray:字节组成的 有序的 可变 序列
小技巧:查看一个类的内置方法
for _def in dir(list):
if "__" in _def: # 内部方法跳过
continue
else:
print(_def)
对比list和tuple的结果如下:
append | clear | copy | count | extend | index | insert | pop | remove | reverse | sort | |
---|---|---|---|---|---|---|---|---|---|---|---|
list | y | y | y | y | y | y | y | y | y | y | y |
tuple | y | y |
PS:元组只不过是可读的列表,并由[]改为()
# 定义
empty_list = []
num_list = [1,2,3,4,5,6,7,8,9,10]
mix_list = [1,"str",[1,2],[3,4]]
empty_tuple = ()
num_tuple = (1,2,3,4,5,6,7,8,9,10)
mix_tuple = (1,"str",(1,2),[3,4])
# 增
empty_list.append("a") # 插入元素,默认末端插入
empty_list.append("b")
empty_list.insert(0,"e") # 指定位置插入元素
empty_list.insert(-1,"e")
empty_list.extend(["c","d"]) # 扩展,在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
empty_list.append(["c","d"])
# 拼接
print(num_list + mix_list) # 拼接两个list
print(num_list * 3) # 拼接三个相同的list
# 删
empty_list.remove("e") # 指定元素删除,# 移除列表中某个值的第一个匹配项
empty_list.pop() # 弹栈,删除末端的一个元素
del(empty_list[-1]) # 非list内置方法
del(empty_list) # 整个对象删除,连变量名都不存在了
empty_list.clear() # 清空,变成空的列表[],变量还是存在的;与del不同,del后对象是不存在的,使用该变量的花会直接报错
# 改
empty_list[0] = 'change'
# 查--切片
print(num_list)
print(num_list[0:2])
print(num_list[:2])
print(num_list[7:])
print(num_list[7:-1])
print(num_list[-3:])
print(num_list[-3:-1])
print(num_list[10:])
print(num_list[0:-1:3]) # 间隔切片
print(num_list[::3]) # 间隔切片
# 查--检验
print(4 in mix_list)
print(4 in mix_list[-1])
print(1 not in mix_list)
# 查--计数
print(len(num_list)) # 查看整个list的元素数量
print(num_list.count(10)) # 查看指定元素的数量
# 查
cmp(list1, list2) # 比较两个列表的元素
print(num_list(1)) # 从列表中找出某个值第一个匹配项的索引位置
print(len(num_list)) # 查看整个list的元素数量
print(min(num_list)) # 返回列表元素最小值
print(max(num_list)) # 返回列表元素最大值
# 对象的复制
num_copy = num_list.copy() # 使用copy才会在内存中开辟新的内存去存储num_copy的值
num_copy = num_list # 简单的赋值语句只不过是两个不同的变量名指向同一块内存,感觉上就是改变一个,另一个也改变
num_copy = list(seq) # 将元组转换为列表
# 顺序操作
num_list.reverse() # 反向列表中元素
print(num_list)
num_list.sort() # 对原列表进行排序,模式升序,配合reverse(),升降序就都实现了
print(num_list)
映射Mapping
- dict:字典
- dict内置函数如下:
- copy:返回一个字典的浅复制
- fromkeys:以指定序列为键创建一个新字典,值都是一致的,使用场景很特定
- update:以键批量更新的方法,(相同的更新,缺少的增补)
- get:返回指定键的值,如果值不在字典中返回default值
- setdefault:和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
- pop:删除字典给定键 key 所对应的值,返回值为被删除的值;key值必须给出,否则返回default值
- popitem:随机返回并删除字典中的一对键和值
- clear:删除字典内所有元素,变为{}
- items
- keys
- values
- dict内置函数如下:
# 键必须是唯一的,但值则不必。
# 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组
# d = {key1 : value1, key2 : value2 }
dict1 = { 'abc': 456,'sss':'sss',100:100 }
dict2 = { 'abc': 123, 98.6: 37, 'sss':['a',3,5] }
dict3 = dict.fromkeys([1,2,3], [1,2,3]) # {1: [1, 2, 3], 2: [1, 2, 3], 3: [1, 2, 3]}
# 访问/取值,依靠键
dict2['abc'] # 返回123
dict2.get('abc','no') # 效果一样,但如果建不存在,会方法默认值,这里设为no,默认值的参数默认是None
dict2.setdefault('s','sd') # 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default,default默认为None
# 批量更新
dict2.update(dict1) # 相同的键,就更新值,缺少的键,直接增补
print(dict2) # {98.6: 37, 100: 100, 'abc': 456, 'sss': 'sss'}
# 删除
print(dict2.pop("abc")) # 指定键,进行删除,并返回该键对应的值,如果键不存在,直接报错
print(dict2.popitem()) # 随机删除一对键值,并返回该对键值的元组形式
# 遍历
for k,v in dict2.items():
print(k,":",v)
for k in dict2.keys():
print(k)
for v in dict2.values():
print(v)
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢
- 需要占用大量的内存,内存浪费多
而list相反:
- 查找和插入的时间随着元素的增加而增加
- 占用空间小,浪费内存很少
所以,dict是用空间来换取时间的一种方法
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)
集合Sets
- set:可变集合
- set和dict类似,也是一组key的集合,但不存储value;这些key既不重复,也无序
- frozenset:不可变集合
set | frozenset | 说明 | |
---|---|---|---|
add | y | ||
clear | y | y | |
copy | y | ||
difference | y | y | |
difference_update | y | ||
discard | y | ||
intersection | y | y | |
intersection_update | y | ||
isdisjoint | y | y | |
issubset | y | y | |
issuperset | y | y | |
pop | y | ||
remove | y | ||
symmetric_differen | y | y | |
symmetric_difference_update | y | ||
union | y | y | |
update | y |
Python的数据结构的更多相关文章
- python 与数据结构
在上面的文章中,我写了python中的一些特性,主要是简单为主,主要是因为一些其他复杂的东西可以通过简单的知识演变而来,比如装饰器还可以带参数,可以使用装饰类,在类中不同的方法中调用,不想写的太复杂, ...
- [0x00 用Python讲解数据结构与算法] 概览
自从工作后就没什么时间更新博客了,最近抽空学了点Python,觉得Python真的是很强大呀.想来在大学中没有学好数据结构和算法,自己的意志力一直不够坚定,这次想好好看一本书,认真把基本的数据结构和算 ...
- Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET
Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET Python -- 堆数据结构 heapq 分类: Python 2012-09 ...
- python实现数据结构单链表
#python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...
- 《用Python解决数据结构与算法问题》在线阅读
源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...
- 用Python实现数据结构之二叉搜索树
二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 ...
- (python数据分析)第03章 Python的数据结构、函数和文件
本章讨论Python的内置功能,这些功能本书会用到很多.虽然扩展库,比如pandas和Numpy,使处理大数据集很方便,但它们是和Python的内置数据处理工具一同使用的. 我们会从Python最基础 ...
- python的数据结构分类,以及数字的处理函数,类型判断
python的数据结构分类: 数值型 int:python3中都是长整形,没有大小限制,受限内存区域的大小 float:只有双精度型 complex:实数和虚数部分都是浮点型,1+1.2J bool: ...
- Python 基本数据结构
Python基本数据结构 数据结构:通俗点儿说,就是存储数据的容器.这里主要介绍Python的4种基本数据结构:列表.元组.字典.集合: 格式如下: 列表:list = [val1, val2, va ...
- 转 Python常见数据结构整理
http://www.cnblogs.com/jeffwongishandsome/archive/2012/08/05/2623660.html Python常见数据结构整理 Python中常见的数 ...
随机推荐
- JAVA框架:hibernate
一:介绍 hibernate是java中的dao层,即和持久层打交道.底层也是数据库驱动.连接等.他也有orm,类和数据库的映射. 二.部署 下载地址:https://sourceforge.net/ ...
- 《Java程序设计》第2周学习总结(Markdown语法修改版)
20175105 2018-2019-2 <Java程序设计>第2周学习总结 Vim操作的一些总结 这些天通过学习,对于vim的操作有了很大的提升,下面我把vim的比较常见的操作方式做了归 ...
- mysql linux 安装卸载
mysql安装包官网https://dev.mysql.com/downloads/mysql/5.7.html#downloads wget https://dev.mysql.com/get/Do ...
- jqgrid 设置多表头
有时,我们需要给jqgrid设置多表头信息,多表头区域会有行合并/列合并,如何实现? 1)通过jqgrid的 setGroupHeaders 方法来实现一个行的多表头, 2)如果有多行表头,需要设置多 ...
- jqgrid 设置行编辑为本地端编辑状态
有时,我们需要在jqgrid表格中做编辑操作,而jqgrid默认是启动了行保存连接到服务器更新.此时,如果没有指定editurl的有效url值时会报错 有时,我们需要将编辑完的表格数据一次性提交保存( ...
- 20155238 2016-2017-2 《JAVA程序设计》第八周学习总结
教材学习内容总结 第十四章 NIO NIO使用频道(Channel)来衔接数据节点,处理数据时,NIO可以让你设定缓冲区(Buffer)容量, 在缓冲区对感兴趣的数据区块进行标记,对于这些标记,提供了 ...
- 20155304田宜楠《网络对抗技术》Exp1 PC平台逆向破解(5)M
Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序 ...
- 20155338《网络对抗》Exp3 免杀原理与实践
20155338<网络对抗>Exp3 免杀原理与实践 实验过程 一.免杀效果参考基准 Kali使用上次实验msfvenom产生后门的可执行文件,上传到老师提供的网址http://www.v ...
- C#基础之.NET环境下WebConfig的加密
在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...
- ubuntu12.04安装OVS
1.下载openVswitch ovs官网 2.运行如下脚本 #!/bin/bash cd /home/sdn/ovs/openvswitch- rm /usr/local/etc/openvswit ...