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
# 键必须是唯一的,但值则不必。
# 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组
# 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有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢
  2. 需要占用大量的内存,内存浪费多

而list相反:

  1. 查找和插入的时间随着元素的增加而增加
  2. 占用空间小,浪费内存很少

所以,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

参考:https://www.liaoxuefeng.com/

Python的数据结构的更多相关文章

  1. python 与数据结构

    在上面的文章中,我写了python中的一些特性,主要是简单为主,主要是因为一些其他复杂的东西可以通过简单的知识演变而来,比如装饰器还可以带参数,可以使用装饰类,在类中不同的方法中调用,不想写的太复杂, ...

  2. [0x00 用Python讲解数据结构与算法] 概览

    自从工作后就没什么时间更新博客了,最近抽空学了点Python,觉得Python真的是很强大呀.想来在大学中没有学好数据结构和算法,自己的意志力一直不够坚定,这次想好好看一本书,认真把基本的数据结构和算 ...

  3. Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET

    Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET Python -- 堆数据结构 heapq 分类: Python 2012-09 ...

  4. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  5. 《用Python解决数据结构与算法问题》在线阅读

    源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...

  6. 用Python实现数据结构之二叉搜索树

    二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 ...

  7. (python数据分析)第03章 Python的数据结构、函数和文件

    本章讨论Python的内置功能,这些功能本书会用到很多.虽然扩展库,比如pandas和Numpy,使处理大数据集很方便,但它们是和Python的内置数据处理工具一同使用的. 我们会从Python最基础 ...

  8. python的数据结构分类,以及数字的处理函数,类型判断

    python的数据结构分类: 数值型 int:python3中都是长整形,没有大小限制,受限内存区域的大小 float:只有双精度型 complex:实数和虚数部分都是浮点型,1+1.2J bool: ...

  9. Python 基本数据结构

    Python基本数据结构 数据结构:通俗点儿说,就是存储数据的容器.这里主要介绍Python的4种基本数据结构:列表.元组.字典.集合: 格式如下: 列表:list = [val1, val2, va ...

  10. 转 Python常见数据结构整理

    http://www.cnblogs.com/jeffwongishandsome/archive/2012/08/05/2623660.html Python常见数据结构整理 Python中常见的数 ...

随机推荐

  1. Qt Creator无法debug,报错:The selected debugger may be inappropriate for the inferior. Examining symbols and setting breakpoints by file name and line number may fail. The inferior is in the Portable ...

    看到这个报错我是绝望的 解决:下载windows sdk  win10 sdk 只安装Debugging Tools for Windows 打开 工具-选项-Kits 安装sdk成功后我们可以看到 ...

  2. WorldWind源码剖析系列:窗口定制控件类WorldWindow

    在WorldWindow定制控件是从Control类派生出来的,需要自己操纵GDI+绘制所需要的界面效果,这种自定义控件比较耗费精力,需要比较深厚的GDI+和DirectX 3D开发功底.(区别于用户 ...

  3. Android Fragment(三)ListFragment简单介绍以及Fragment之间通信

    一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...

  4. FPGA按一下按键,对应端口输出单个脉冲

    对于FPGA的verilog语言,,,规定一个变量不能在多个always中被赋值.但是可以在多个alway块中做判断--结合状态机思想 module state(key,led,clk); input ...

  5. 20155234 《网络对抗》Exp 8 Web基础

    基础问答 什么是表单 可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单包括两个部分:一部分是HTML源代码用于描述表单(例如,域,标签和用户在页面上看见的按钮),另一部分是脚本 ...

  6. 20155305《网络对抗》Web安全基础实践

    20155305<网络对抗>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL ...

  7. 搭建django虚拟环境完整步骤

    一.建立虚拟环境 pip install virtualenv 要使用Django,首先要建立一个虚拟工作环境.我们先为项目建立一个文件夹learn,在文件夹中打开命令行(shift+右击),来建立另 ...

  8. Android几行代码实现监听微信聊天

    原创作品,转载请注明出处,尊重别人的劳动果实. 2017.2.7更新: *现在适配微信版本更加容易了,只需要替换一个Recourse-ID即可 *可以知道对方发的是小视频还是语音,并获取秒数. *可以 ...

  9. 【亲测有效】Nodepad++/Sublime Text3中Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level解决策略

    我在开发游戏的时候,发现一个python脚本,本来都运行好好的,然后写了几行代码,而且也都确保每行都对齐了,但是运行的时候,却出现语法错误: IndentationError: unindent do ...

  10. 【URLOS应用开发基础】10分钟制作一个nginx静态网站环境应用

    URLOS开发者功能已上线有一段时间了,目前通过部分开发者的使用体验来看,不得不说URLOS在服务器软件开发效率方面确实有着得天独厚的优势,凭借docker容器技术与其良好的应用生态环境,URLOS必 ...