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 相关文章推荐
python cookielib 登录人人网的实现代码
Dec 19 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
选择python进行数据分析的理由和优势
Jun 25 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
使用 Python 遍历目录树的方法
Feb 29 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
Python实现文件压缩和解压的示例代码
Aug 12 Python
Python安装并操作redis实现流程详解
Oct 13 Python
用pushplus+python监控亚马逊到货动态推送微信
Jan 29 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
discuz Passport 通行证 整合笔记
2008/06/30 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
php实现的生成排列算法示例
2019/07/25 PHP
accesskey 提交
2006/06/26 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python机器学习实战之树回归详解
2017/12/20 Python
python循环输出三角形图案的例子
2019/11/22 Python
CSS3过渡transition效果实例介绍
2016/05/03 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
聘任书的写作格式及范文
2014/03/29 职场文书
门前三包责任书
2014/04/15 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
红色经典电影观后感
2015/06/18 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS