Python内建数据结构详解


Posted in Python onFebruary 03, 2016

一、列表(List)

list 是一个可以在其中存储一系列项目的数据结构。list 的项目之间需用逗号分开,并用一对中括号括将所有的项目括起来,以表明这是一个 list 。下例用以展示 list 的一些基本操作:

# 定义一个 list 对象 class_list:
class_list = ['Michael', 'Bob', 'Tracy']
# 获得一个 class_list 的长度
print 'class have', len(class_list), 'students'
# 访问class_list中的对象
print 'The 3rd student in class is', class_list[2]
# 往 class_list 中插入对象
class_list.append('Paul')
# 从 class_list 中删除一个项目
del class_list[0]
# 对 class_list 进行排序
class_list.sort()
# 遍历整个class_list中的项目
print 'These students are :',
for student in class_list:
  print student,

输出结果为:

class have 3 students
The 3rd student in class is Tracy
These students are : Bob Paul Tracy

关于上面的代码有几点要注意的是:

可以往 class_list 中加入任何类型的对象,也就是说,并不要求一个 list 中的项目具有相同类型。你甚至可以往 class_list 中插入一个list。
排序函数作用于本身, 而不是返回一个副本,这与字符串类型是不同的,因为字符串不可修改。
print 函数的end关键字参数用来指定输入完成之后的输出,默认是换行符,上面的代码用空格符替代换行符。

二、元组(Tuple)

tuple 在用法与概念上与 list 没有多大差别,可以将 tuple 看做是一个只读版list。也就是说tuple一经定义便不能被修改——不能添加和删除对象,也不能修改tuple中的对象。

tuple中的项同样应该用逗号分开,并用圆括号将这些项目括起来以表是是一个tuple。这个圆括号是可选的,也就是说可以用以下两种方式定义一个tuple:

t = 'Adam', 'Lisa', 'Bart'
t = ('Adam', 'Lisa', 'Bart')
不过省掉那对圆括号不见得是什么好的习惯。另外当tuple只有一个项时,第一项之后必须有一个逗号,该情况下应该这样定义t = ('Adam',)。这似乎是一个古怪的约束,但是假如没有这个逗号,不带括号定义的tuple就变成了t = 'Adam'这明显具有二义性。

三、字典(Dictionary)

字典可以看做是一组键-值(key-value)对的集合。键必须是唯一的,而每一个键关联着一个值。key必须是一个不可变的对象(如:tuple、数值型、字符串)。还要注意的是,在字典中的键值对并没有以任何方式进行排序。

一个字典的定义应该照这样的格式d={key1 : value1, key2 : value2, key3 : value3}。键和值之间用冒号分隔,而键值对之间用逗号相隔,再用大括号将所有的键值对括起来。一些基本操作如下:

# 字典的定义
d = {
  'Adam': 95,
  'Lisa': 85,
  'Bart': 59
}
# 通过键来获取值
print "Adam's score is", d['Adam']
# 删除一个键值对
del d['Bart']
# 遍历字典
for name, score in d.items():
  print '{0} is {1}'.format(name, score)
# 往字典中增加一个键值对
d['Paul'] = 72
# 判断字典中是否存在某键,也可以用 if ab.has_key('Lisa')
if 'Lisa' in d:
  print "Lisa's address is", d['Lisa']

输出的结果为:

Adam's score is 95
Lisa is 85
Adam is 95
Lisa's address is 85

四、序列(Sequences)

上面介绍的三种内建数据结构都是序列,索引操作是序列的一个基本操作。通过下标操作可以直接访问序列中的对象。上面虽然已经演示了下标操作——队列和元组用数字下标,字典用关键字下标。

序列的下标是从0开始的,上面的例子中只使用了下标为正数的情况,其实下标还可以为负数,如-1,-2,-3…。负数下标表示的意义为反方向的位置,如class_list[-1]返回的是class_list的倒数第一个项目。

序列不但支持负数下标还支持双下标,这对双下标表示一个区间。如class_list[0:3]返回的是一个class_list中从下标为1到下标为3之前的子序列副本。注意这个区间是一对半闭半开的区间。这种操作被称作切片操作(slicing operation)。如果切片操作的第二个下标超出了序列的范围,那么切片操作会到序列的末尾终止。切片操作中的两个下标都有默认值,第一个的默认值为0,第二个的大小为序列的长度。

还可以给切片操作提供第三个参数,第三个参数代表切片操作的步长,它的默认值是1。步长代表了项与项之间的间距,比方name[0:10:3],返回的就是name中下标为0,3,6,9组成的子序列。

五、集合(Set)

集合是无序简单对象的聚集。当你只关注一个对象是否存在于聚集中,而不管它存在的顺序或在出现的次数时,则适宜用集合。基本功能:判断是否是集合的成员、一个集合是不是另一个集合的子集、获取两个集合的交集等等。实例:

s = set(['Adam', 'Lisa', 'Bart', 'Paul'])
# 判断对象是否在集合中
if 'Bart' in s:
  print "Bart is in ?", 'Bart' in s
# 使用copy函数来拷贝一个set
sc = s.copy()
# 往集合中添加对象
sc.add('Bill')
# 从集合中删除对象
sc.remove('Adam')
# 求两个集合的交集,也可以使用 s.intersection(sc)
print s & sc

输出的结果:

Bart is in ? True
set(['Lisa', 'Paul', 'Bart'])
Python 相关文章推荐
web.py在SAE中的Session问题解决方法(使用mysql存储)
Jun 24 Python
详解Python编程中包的概念与管理
Oct 16 Python
利用aardio给python编写图形界面
Aug 21 Python
python实现逆序输出一个数字的示例讲解
Jun 25 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
Python解析树及树的遍历
Feb 03 #Python
Python实现二叉堆
Feb 03 #Python
Python实现二叉搜索树
Feb 03 #Python
Python的组合模式与责任链模式编程示例
Feb 02 #Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 #Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 #Python
Python找出9个连续的空闲端口
Feb 01 #Python
You might like
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
JavaScript事件对象深入详解
2018/12/30 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
数学教学随笔感言
2014/02/17 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python