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 相关文章推荐
Python3 入门教程 简单但比较不错
Nov 29 Python
Python实现将n个点均匀地分布在球面上的方法
Mar 12 Python
Python使用wxPython实现计算器
Jan 30 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
利用Python进行数据可视化常见的9种方法!超实用!
Jul 11 Python
Python3实现定时任务的四种方式
Jun 03 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 Python
python 通过手机号识别出对应的微信性别(实例代码)
Dec 22 Python
python boto和boto3操作bucket的示例
Oct 30 Python
Django模型层实现多表关系创建和多表操作
Jul 21 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
JAVA/JSP学习系列之七
2006/10/09 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
查询绑定数据岛的表格中的文本并修改显示方式的js代码
2009/12/15 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
2016/06/13 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
JavaScript实现前端分页控件
2017/04/19 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
Python入门篇之编程习惯与特点
2014/10/17 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
Tesserocr库的正确安装方式
2018/10/19 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
啤酒销售实习自我鉴定
2013/09/24 职场文书
爱岗敬业演讲稿范文
2014/01/14 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
小学安全汇报材料
2014/08/14 职场文书
2014年法院工作总结
2014/11/24 职场文书
贫困生助学金感谢信
2015/01/21 职场文书
企业介绍信范文
2015/01/30 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL