Python基础【第八篇】:基础数据类型(字典)
字典
字典的特点
另一个非常有用的 Python 内建数据类型是字典 。字典在某些语言中可能称为联合内存 ( associative memories )或联合数组 ( associative arrays )。序列是以连续的整数为索引,称为有序列表。与此不同的是,字典以关键字 为索引,关键字可以是任意不可变类型,通常用字符串或数值,称为无序列表。
两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,字典用"{ }"标识,它是一个无序的键(key) : 值(value)对集合。键(key)必须使用不可变类型,而值则不必要。
在同一个字典中,键(key)必须是唯一的,值则不必要。
如果元组中只包含字符串和数字,它可以做为关键字,如果它直接或间接的包含了可变对象,就不能当做关键字。不能用列表做关键字,因为列表可以用索引、切割或者append() 和extend() 等方法改变。
理解字典的最佳方式是把它看做无序的键: 值对 (key:value 对)集合,键必须是互不相同的(在同一个字典之内)。一对大括号创建一个空的字典:{} 。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式。
字典的主要操作是依据键来存储和析取值。也可以用del 来删除键:值对(key:value)。如果你用一个已经存在的关键字存储值,以前为该关键字分配的值就会被遗忘。试图从一个不存在的键中取值会导致错误。
怎么创建字典呢
dic = {} #创建一个空的字典 dic['key1'] = "百度" dic['key2'] = "tencent" #dic[key] = value dic[1] = 'alibaba' dic[2] = 'jingdong' print("dic:",dic)
dic: {'key2': 'tencent', 2: 'jingdong', 'key1': '百度', 1: 'alibaba'}
将代码再运行一次,输出:
dic: {'key1': '百度', 2: 'jingdong', 1: 'alibaba', 'key2': 'tencent'}
可见字典里元素的存储是无序的,每次输出的位置不一样,并不是按索引来排序的。
我们还可以这样创造字典
dic = {'key1' : 'alibaba' , 'key2' : 'tencent' ,99 : 88} #{键:值,键:值......} print(dic) #输出: #{99: 88, 'key2': 'tencent', 'key1': 'alibaba'}
字典元素的增删减查
字典里的元素是可以通过键值来进行增删改查的。
字典元素的查询
把相应的键值放到括号中进行访问,就像访问字符串一样,只是字符串括号里是索引:
dic = {'key1' : 'alibaba' , 'key2' : 'tencent' ,99 : 88} print("键key1对应的值为:",dic['key1']) print("键key2对应的值为:",dic['key2'])
此示例输出:
键key1对应的值为: alibaba
键key2对应的值为: tencent
注意:如果访问字典里不存在的索引则会出现错误。
字典元素的删除
删除字典里的键值;清空字典里的元素;删除整个字典。
dic = {'key1' : 'alibaba' , 'key2' : 'tencent' ,99 : 88} #删除键key1 del dic['key1'] #清空字典里的元素 dic.clear() #删除整个字典 del dic
字典元素的修改与增加
向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:
dic = {'key1' : 'alibaba' , 'key2' : 'tencent' ,99 : 88} print('原始字典',dic) dic["key3"] = 'baidu' dic["key2"] = 'jingdong' print("修改后的字典:",dic)
输出:
原始字典 {'key1': 'alibaba', 99: 88, 'key2': 'tencent'} 修改后的字典: {'key1': 'alibaba', 99: 88, 'key3': 'baidu', 'key2': 'jingdong'}
字典的内置方法
- len(dict) 计算字典元素个数,即键的总数。
>>> dict = {'key1':'alibaba','key2':'baidu','key3':'tencent'} >>> len(dict) 3
- str(dict) 以字符串的形式输出字典
- type(dict) 返回输入的变量类型,如果变量是字典就返回字典类型。
>>> dict = {'key1':'alibaba','key2':'baidu','key3':'tencent'} >>> type(dict) <class 'dict'> >>> str1 = str(dict) >>> str1 "{'key2': 'baidu', 'key1': 'alibaba', 'key3': 'tencent'}" >>> type(str1) <class 'str'>
- dict.clear() 清楚字典里的元素。
- dict.copy() 返回字典的一个浅拷贝,详解直接赋值、浅拷贝、深拷贝解析
- dict.fromkeys(seq,value) 此方法返回一个由序列seq为键,value为所有键初始化的值的字典。使用字典dict直接调用。
>>> seq = ['name','age','salary'] >>> value = 20 >>> dict.fromkeys(seq) {'name': None, 'age': None, 'salary': None} >>> dict.fromkeys(seq,value) {'name': 20, 'age': 20, 'salary': 20}
- dict.get(key,default = None) 返回字典中键key对应的值,如果未找到则返回默认值default。
>>> dict = {'name':'刘德华','age':18,'salary':200000} >>> dict.get('name') '刘德华' >>> dict.get('gender','male') 'male' >>> dict.get('gender') >>> #返回None,并不会报错
- key in dict 判断dict中是否有键key。
dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'} print('键taobao是否在字典中?','taobao' in dict) print('键alibaba是否在字典中?','alibaba' in dict)
键taobao是否在字典中? True 键alibaba是否在字典中? False
- dict.items() 返回一个可遍历的(键, 值) 元组数组。
>>> dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'} >>> dict.items() dict_items([('taobao', '马云'), ('baidu', '李彦宏'), ('tencent', '马化腾')]) >>> type(dict.items()) <class 'dict_items'>
#遍历字典列表 dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'} for key,value in dict.items(): print('%s公司是%s的'%(key,value))
taobao公司是马云的 tencent公司是马化腾的 baidu公司是李彦宏的
- dist.keys() 返回一个由键组成的迭代器。注意:python2中是返回一个列表。
- dist.values() 返回一个由值组成的迭代器。注意:python2中是返回一个列表。
dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'} print(dict.keys()) print(dict.values()) print(type(dict.keys())) print(type(dict.values())) print(list(dict.keys())) print(list(dict.values())) print(type(list(dict.keys()))) print(type(list(dict.values())))
输出:
dict_keys(['baidu', 'tencent', 'taobao']) dict_values(['李彦宏', '马化腾', '马云']) <class 'dict_keys'> <class 'dict_values'> ['baidu', 'tencent', 'taobao'] ['李彦宏', '马化腾', '马云'] <class 'list'> <class 'list'>
- dist.setdefault(key,value) 如果 key 在 字典中,返回对应的值。如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。
dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'} print(dict.setdefault('taobao')) print(dict.setdefault('京东','刘强东')) print(dict)
输出:
马云 刘强东 {'taobao': '马云', 'tencent': '马化腾', 'baidu': '李彦宏', '京东': '刘强东'}
- dict.update(dict1) 将字典dict1中的元素加到dict中,无返回值。
>>> dict = {'Name': 'Runoob', 'Age': 7} >>> dict1 = {'sexy':'male','salary':2000} >>> dict.update(dict1) >>> dict {'Name': 'Runoob', 'Age': 7, 'sexy': 'male', 'salary': 2000}
- dict.pop(key,default) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'} print('原始字典:',dict) delete_value = dict.pop('taobao','default') print("删除键‘taobao’对应的值‘%s’后的新字典:"%delete_value,dict) print(dict.pop('alibaba','default'))
输出:
原始字典: {'baidu': '李彦宏', 'taobao': '马云', 'tencent': '马化腾'} 删除键‘taobao’对应的值‘马云’后的新字典: {'baidu': '李彦宏', 'tencent': '马化腾'} default
- dict.popitem() 随机返回并删除字典中的一对键和值(一般删除末尾对)。如果字典已经为空,却调用了此方法,就报出KeyError异常。
dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏','jingdong':'刘强东'} print('随机删除',dict.popitem()) print("删除后的字典:",dict)
输出:
随机删除 ('jingdong', '刘强东') 删除后的字典: {'baidu': '李彦宏', 'tencent': '马化腾', 'taobao': '马云'}
Python直接赋值、浅拷贝、深拷贝解析
-
直接赋值:其实就是对象的引用(别名)。
-
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
-
深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。


id(list_original): 1208822144328 id(list_direct): 1208822144328 id(list_copy): 1208822144840 id(list_deepcopy): 1208822257224 list_original: ['alibaba', [1, 2, 3], 4, 5, 6] list_direct): ['alibaba', [1, 2, 3], 4, 5, 6] list_copy): ['alibaba', [1, 2, 3], 4, 5] list_deepcopy): ['alibaba', [1, 2, 3], 4, 5] list_original: ['alibaba', [1, 2, 3, 7], 4, 5, 6] list_direct): ['alibaba', [1, 2, 3, 7], 4, 5, 6] list_copy): ['alibaba', [1, 2, 3, 7], 4, 5] list_deepcopy): ['alibaba', [1, 2, 3], 4, 5]
直接赋值:
list_original和list_direct指向的是同一个对象。
使用copy方法拷贝:
list_original和list_copy是两个独立的对象,但他们的子对象还是指向统一对象(是引用)。
使用deepcopy拷贝:
list_original和list_deepcopy是两个独立对象,他们的子对象也是独立对象。