博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pythoning —— 4、数据类型(字典)
阅读量:6414 次
发布时间:2019-06-23

本文共 3815 字,大约阅读时间需要 12 分钟。

通过之前的内容,我们了解到,列表这种结构适合于将值组织到一个结构中,并通过编号对其进行引用。但是我们有时候会需要一种更便捷明了的方式存取、一种以名字来操作引用值的数据结构,这种类型的数据结构称为映射。字典是python中(本人唯一已知)的映射类型。

字典的使用

  字典这个名称已经给出了其很多的信息,其构造方式是以通过某个特定的词语(键),从而找到他的意义(值)。

  某些情况下用字典会比使用列表让程序结构更加清晰明了。比如:游戏棋盘了、存储文件修改时间了、数字电话了、地址薄了、学生成绩单了。。。

创建和使用字典

  字典可以通过如下方式创建:

>>> testdict = {
"test_key1":"test_value1",test_key2":"test_value2"}

  字典有多个键及其对应的值组成,键值对之间以","分割,键是唯一的,值可以重复

dict函数

  可以通过dict函数,将(键值)对的序列建立字典,也可以通过关键字创建字典。

>>> items = [("name","jams"),("age",25)]>>> test = dict(items)>>> test{
'name': 'jams', 'age': 25} >>> d = dict(name = 'Gumbi',age = 23) >>> d {'name': 'Gumbi', 'age': 23}  

基本字典操作

  字典基本行为:

    1. len(d)返回d的项的数量;
    2. d[k]返回关联到键k上的值
    3. d[k] = v将v值关联到k键上
    4. del d[k]删除键为k的项
    5. k in d 检查d中是否含有键为k的项

  键类型:字典的键不一定为整型数据,可以使任意不可变类型,如浮点型、字符串、元组等。

  自动添加:键在字典中不存在时,也可为它赋值,这样的操作,会将该键值对插入字典中,完成添加操作

  成员资格:表达式k in d查找的是键而不是值,这与列表、元组、字符串等有区别。其优势也会更加明显,在字典中查看成员资格比列表中的更高效,数据结构规模越大,效率反差越大。

>>> a = {("name","jams"):{
'age':23,'add':'dongsanqi'}}>>> a['testK'] = 'testV'>>> a{
'testK': 'testV', ('name', 'jams'): {
'add': 'dongsanqi', 'age': 23}}>>> 'testK' in aTrue>>> del a['testK']>>> a{('name', 'jams'): {
'add': 'dongsanqi', 'age': 23}}>>> len(a)1

字典的格式化字符串

  之前字符串格式化中提到过可以用元组来格式化字符串,其实字典也是可以操作的。只是转换说明符要变化一下。话不多说,看代码先。

>>> phonebook = {
'king':'1123','joker':'1124','lucy':'1125'}>>> 'king\'s phone number is %(king)s'%phonebook"king's phone number is 1123"

字典方法

  就像其他内建类型一样,字典也有方法。可能不会像雷暴或字符串方法那么频繁使用,但也是灰常有用哒。

  clear

  clear用于清除字典中的所有项,这个方法为原地操作,无返回值,操作结束后,字典为空字典。

>>> test_dict = {
1:'enheng','name':'biubiu','age':34}>>> test_dict.clear()>>> test_dict{}

copy

同列表一样,是个浅拷贝,如果想要避免其带来的负面影响,可以使用深拷贝即deep copy

>>> x = {'name':'admin','val':['foo','bar','baz']}

>>> y = x.copy()
>>> y['name']='fukuda'
>>> y['val'].append('test')
>>> y
{'val': ['foo', 'bar', 'baz', 'test'], 'name': 'fukuda'}
>>> x
{'val': ['foo', 'bar', 'baz', 'test'], 'name': 'admin'}
>>> from copy import deepcopy
>>> z = deepcopy(x)
>>> x['name'] = 'jing'
>>> x['val'].remove('foo')
>>> x
{'val': ['bar', 'baz', 'test'], 'name': 'jing'}
>>> y
{'val': ['bar', 'baz', 'test'], 'name': 'fukuda'}
>>> z
{'val': ['foo', 'bar', 'baz', 'test'], 'name': 'admin'}

fromkeys

  fromkeys使用给定的键建立新的字典,每个键都对应一个默认的值None。此外你还可以直接在dict上面调用该方法,如果不想使用None作为默认值,可以自己提供默认值。

>>> {}.fromkeys('name','age','add')

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: fromkeys expected at most 2 arguments, got 3
>>> {}.fromkeys(['name','age','add'])
{'add': None, 'age': None, 'name': None}
>>> dict.fromkeys(['name','age','add'])
{'add': None, 'age': None, 'name': None}
>>> dict.fromkeys(['name','age','add'],'unknown')
{'add': 'unknown', 'age': 'unknown', 'name': 'unknown'}

get

  get是个体面的方法,一般来说,如果你试图直接用d[k]方式访问字典中的不存在的项,会报错,这就尴尬了,而get就不会。他会返回一个None,它还可以指定默认值,这样就会提高程序的容错率。

>>> d = {}>>> print(d['name'])Traceback (most recent call last):  File "
", line 1, in
KeyError: 'name'>>> print(d.get('name'))None>>> print(d.get('name','doubi'))doubi

 

pop

  pop方法用来获得对应给定键的值,然后将这个键值对从字典中移除

>>> d = {
'x':1,'y':2}>>> d.pop('x')1>>> d{
'y': 2}

setdefault

  setdefault某种意义上与get类似,能够获得与给定键相关联的值,除此之外,它还是get的升级,如果该值不存在,则会设定相应的键值。如果键值存在,就不会改变字典,默认值可选。如果不设定,会默认使用None。

>>> d = {}>>> d.setdefault('name','king')'king'>>> d{
'name': 'king'}>>> d.setdefault('name','fukuda')'king'>>> d{
'name': 'king'}>>> d.setdefault('age')>>> d{
'age': None, 'name': 'king'}

update

  update方法可以利用一个字典项更新另一个字典,提供的字典中的项会被添加到旧的字典中,若有相同的键,则会覆盖。

>>> d{
'age': None, 'name': 'king'}>>> d = {
'name':'king','age':23,'add':'dongsanqi'}>>> du = {
'name':'king','age':24,'phone':'1134'}>>> d.update(du)>>> du{
'age': 24, 'name': 'king', 'phone': '1134'}>>> d{
'age': 24, 'phone': '1134', 'name': 'king', 'add': 'dongsanqi'}

 

 

转载于:https://www.cnblogs.com/fukuda/p/5509529.html

你可能感兴趣的文章
思科GNS3
查看>>
前端基础01 HTML
查看>>
直方图均衡化 EqualizeHist
查看>>
tcpdump+wireshark 调试网络应用
查看>>
CentOS6.4配置yum源
查看>>
MFC 用CreateWindow创建的动态Button,如何指定ID?
查看>>
linux sed常用
查看>>
excel数据统计分析面面观
查看>>
jquery Map
查看>>
Linux下安装JDK的几种方法
查看>>
Centos6.5 WIFI无线网卡驱动BCM43142驱动安装
查看>>
linux 安装 oracle 11g
查看>>
我的友情链接
查看>>
windows注册表修改同步时间频率
查看>>
nginx的七层负载均衡
查看>>
TestNG report in IDEA
查看>>
mysql事务
查看>>
Oracle Virtualbox视图切换
查看>>
安装vCenter6.0遇到的问题以及解决方法
查看>>
zabbix调优
查看>>