Python中内置数据类型list,tuple,dict,set的区别和用法


Posted in Python onDecember 14, 2015

Python语言简洁明了,可以用较少的代码实现同样的功能。这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set。这里对他们进行一个简明的总结。

List

字面意思就是一个集合,在Python中List中的元素用中括号[]来表示,可以这样定义一个List:

L = [12, 'China', 19.998]

可以看到并不要求元素的类型都是一样的。当然也可以定义一个空的List:

L = []

Python中的List是有序的,所以要访问List的话显然要通过序号来访问,就像是数组的下标一样,一样是下标从0开始:

>>> print L[0]
12

千万不要越界,否则会报错

>>> print L[3]
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
IndexError: list index out of range

List也可以倒序访问,通过“倒数第x个”这样的下标来表示序号,比如-1这个下标就表示倒数第一个元素:

>>> L = [12, 'China', 19.998]
>>> print L[-1]
19.998

-4的话显然就越界了

>>> print L[-4]

Traceback (most recent call last):
 File "<pyshell#2>", line 1, in <module>
  print L[-4]
IndexError: list index out of range
>>>

List通过内置的append()方法来添加到尾部,通过insert()方法添加到指定位置(下标从0开始):

>>> L = [12, 'China', 19.998]
>>> L.append('Jack')
>>> print L
[12, 'China', 19.998, 'Jack']
>>> L.insert(1, 3.14)
>>> print L
[12, 3.14, 'China', 19.998, 'Jack']
>>>

通过pop()删除最后尾部元素,也可以指定一参数删除指定位置:

>>> L.pop()
'Jack'
>>> print L
[12, 3.14, 'China', 19.998]
>>> L.pop(0)
12
>>> print L
[3.14, 'China', 19.998]

也可以通过下标进行复制替换

>>> L[1] = 'America'
>>> print L
[3.14, 'America', 19.998]

Tuple

Tuple可以看做是一种“不变”的List,访问也是通过下标,用小括号()表示:

>>> t = (3.14, 'China', 'Jason')
>>> print t
(3.14, 'China', 'Jason')

但是不能重新赋值替换:

>>> t[1] = 'America'

Traceback (most recent call last):
 File "<pyshell#21>", line 1, in <module>
  t[1] = 'America'
TypeError: 'tuple' object does not support item assignment

也没有pop和insert、append方法。

可以创建空元素的tuple:

t = ()
或者单元素tuple (比如加一个逗号防止和声明一个整形歧义):

t = (3.14,)

那么tuple这个类型到底有什么用处呢?要知道如果你希望一个函数返回多个返回值,其实只要返回一个tuple就可以了,因为tuple里面的含有多个值,而且是不可变的(就像是java里面的final)。当然,tuple也是可变的,比如:

>>> t = (3.14, 'China', 'Jason', ['A', 'B'])
>>> print t
(3.14, 'China', 'Jason', ['A', 'B'])
>>> L = t[3]
>>> L[0] = 122
>>> L[1] = 233
>>> print t
(3.14, 'China', 'Jason', [122, 233])

这是因为Tuple所谓的不可变指的是指向的位置不可变,因为本例子中第四个元素并不是基本类型,而是一个List类型,所以t指向的该List的位置是不变的,但是List本身的内容是可以变化的,因为List本身在内存中的分配并不是连续的。

Dict

Dict是Python中非常重要的数据类型,就像它的字面意思一样,它是个活字典,其实就是Key-Value键值对,类似于HashMap,可以用花括号{}通过类似于定义一个C语言的结构体那样去定义它:

>>> d = {
  'Adam': 95,
  'Lisa': 85,
  'Bart': 59,
  'Paul': 75
}
>>> print d
{'Lisa': 85, 'Paul': 75, 'Adam': 95, 'Bart': 59}

可以看到打印出来的结果都是Key:Value的格式,可以通过len函数计算它的长度(List,tuple也可以):

>>> len(d)
4

可以直接通过键值对方式添加dict中的元素:

>>> print d
{'Lisa': 85, 'Paul': 75, 'Adam': 95, 'Bart': 59}
>>> d['Jone'] = 99
>>> print d
{'Lisa': 85, 'Paul': 75, 'Adam': 95, 'Jone': 99, 'Bart': 59}

List和Tuple用下标来访问内容,而Dict用Key来访问: (字符串、整型、浮点型和元组tuple都可以作为dict的key)

>>> print d['Adam']
95

如果Key不存在,会报错:

>>> print d['Jack']

Traceback (most recent call last):
 File "<pyshell#40>", line 1, in <module>
  print d['Jack']
KeyError: 'Jack'

所以访问之前最好先查询下key是否存在:

>>> if 'Adam' in d : print 'exist key'

exist key

或者直接用保险的get方法:

>>> print d.get('Adam')
95
>>> print d.get('Jason')
None

至于遍历一个dict,实际上是在遍历它的所有的Key的集合,然后用这个Key来获得对应的Value:

>>> for key in d : print key, ':', d.get(key)

Lisa : 85
Paul : 75
Adam : 95
Bart : 59

Dict具有一些特点:

查找速度快。无论是10个还是10万个,速度都是一样的,但是代价是耗费的内存大。List相反,占用内存小,但是查找速度慢。这就好比是数组和链表的区别,数组并不知道要开辟多少空间,所以往往开始就会开辟一个大空间,但是直接通过下标查找速度快;而链表占用的空间小,但是查找的时候必须顺序的遍历导致速度很慢
没有顺序。Dict是无顺序的,而List是有序的集合,所以不能用Dict来存储有序集合
Key不可变,Value可变。一旦一个键值对加入dict后,它对应的key就不能再变了,但是Value是可以变化的。所以List不可以当做Dict的Key,但是可以作为Value:

>>> print d
{'Lisa': 85, 'Paul': 75, 'Adam': 95, 'Jone': 99, 'Bart': 59}
>>> d['NewList'] = [12, 23, 'Jack']
>>> print d
{'Bart': 59, 'NewList': [12, 23, 'Jack'], 'Adam': 95, 'Jone': 99, 'Lisa': 85, 'Paul': 75}

Key不可重复。(下面例子中添加了一个'Jone':0,但是实际上原来已经有'Jone'这个Key了,所以仅仅是改了原来的value)

>>> print d
{'Bart': 59, 'NewList': [12, 23, 'Jack'], 'Adam': 95, 'Jone': 99, 'Lisa': 85, 'Paul': 75}
>>> d['Jone'] = 0
>>> print d
{'Bart': 59, 'NewList': [12, 23, 'Jack'], 'Adam': 95, 'Jone': 0, 'Lisa': 85, 'Paul': 75}

Dict的合并,如何将两个Dict合并为一个,可以用dict函数:

>>> d1 = {'mike':12, 'jack':19}
>>> d2 = {'jone':22, 'ivy':17}
>>> dMerge = dict(d1.items() + d2.items())
>>> print dMerge
{'mike': 12, 'jack': 19, 'jone': 22, 'ivy': 17}

或者

>>> dMerge2 = dict(d1, **d2)
>>> print dMerge2
{'mike': 12, 'jack': 19, 'jone': 22, 'ivy': 17}

方法2比方法1速度快很多,方法2等同于:

>>> dMerge3 = dict(d1)
>>> dMerge3.update(d2)
>>> print dMerge
{'mike': 12, 'jack': 19, 'jone': 22, 'ivy': 17}

set

set就像是把Dict中的key抽出来了一样,类似于一个List,但是内容又不能重复,通过调用set()方法创建:

>>> s = set(['A', 'B', 'C'])
就像dict是无序的一样,set也是无序的,也不能包含重复的元素。

对于访问一个set的意义就仅仅在于查看某个元素是否在这个集合里面:

>>> print 'A' in s
True
>>> print 'D' in s
False

大小写是敏感的。

也通过for来遍历:

s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
#tuple
for x in s:
  print x[0],':',x[1]

>>>
Lisa : 85
Adam : 95
Bart : 59

通过add和remove来添加、删除元素(保持不重复),添加元素时,用set的add()方法:

>>> s = set([1, 2, 3])
>>> s.add(4)
>>> print s
set([1, 2, 3, 4])

如果添加的元素已经存在于set中,add()不会报错,但是不会加进去了:

>>> s = set([1, 2, 3])
>>> s.add(3)
>>> print s
set([1, 2, 3])

删除set中的元素时,用set的remove()方法:

>>> s = set([1, 2, 3, 4])
>>> s.remove(4)
>>> print s
set([1, 2, 3])

如果删除的元素不存在set中,remove()会报错:

>>> s = set([1, 2, 3])
>>> s.remove(4)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
KeyError: 4

所以如果我们要判断一个元素是否在一些不同的条件内符合,用set是最好的选择,下面例子:

months = set(['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec',])
x1 = 'Feb'
x2 = 'Sun'

if x1 in months:
  print 'x1: ok'
else:
  print 'x1: error'

if x2 in months:
  print 'x2: ok'
else:
  print 'x2: error'

>>>
x1: ok
x2: error
Python 相关文章推荐
python遍历类中所有成员的方法
Mar 18 Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 Python
Python如何获取系统iops示例代码
Sep 06 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
python os.listdir按文件存取时间顺序列出目录的实例
Oct 21 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
Django学习笔记之为Model添加Action
Apr 30 Python
python函数与方法的区别总结
Jun 23 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
python实战之90行代码写个猜数字游戏
Apr 22 Python
opencv检测动态物体的实现
Jul 21 Python
分享Python字符串关键点
Dec 13 #Python
Python实时获取cmd的输出
Dec 13 #Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 #Python
深入源码解析Python中的对象与类型
Dec 11 #Python
Python实现各种排序算法的代码示例总结
Dec 11 #Python
Python操作MySQL数据库9个实用实例
Dec 11 #Python
使用Python编写简单的画图板程序的示例教程
Dec 08 #Python
You might like
PHP的中问验证码
2006/11/25 PHP
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
php实现的递归提成方案实例
2015/11/14 PHP
PHP的PDO连接讲解
2019/01/24 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python发送以整个文件夹的内容为附件的邮件的教程
2015/05/06 Python
Python 装饰器使用详解
2017/07/29 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
哈弗商学院毕业生求职信
2014/02/26 职场文书
粗暴解决CUDA out of memory的问题
2021/05/22 Python
Go语言编译原理之变量捕获
2022/08/05 Golang