Python成长之路 — 字典
一、字典的定义与创建
字典是Python中唯一内建的映射类型。你可以将其想象成书本的目录,章节名称代表“key”,页码则代表“value”。书本的目录本质上是也是字典。
1、字典的创建
(1)下面通过一个实例引入字典:
使用列表构建包含姓名和电话号码的数据库
names = ['aa','bb','cc','dd','ee','ff'] numbers = [123,456,789,'0121',131415,161718] name = input("please enter your name :") print(numbers[names.index(name)])
使用字典构建包含姓名和电话号码的数据库
info = { 'aa':123, 'bb':456, 'cc':789, 'dd':"0121", 'ee':131415, 'ff':161718 } print(info[input("please enter your name :")])
字典由多个键值对组成,键值对也称为“项”,字典的特性:键是唯一的,值不唯一
(2) 使用dict函数创建字典
items =[('zhangsan',18),('lisi',19),('wangwu',20)] item = dict(items) print(item)
2、字典常用基本操作
字典基本操作:len,d[key],d[k]=v,del d[k],k in d
#计算字典键值对数量 test = { 'aa':123, 'bb':456, 'cc':789, 'dd':"0121", 'ee':131415, 'ff':161718 } print(len(test)) #d[key],获取指定key的值 print(test['bb']) #d[k]=v,修改指定key的value test['ff']=111111111 print(test) #del d[k] 删除指定键的元素 del(test['ff']) print(test) #k in d,查找某个键是否在字典中存在 print('dd' in test)
#简单数据库:每个人的手机号和地址 people={ 'zhangsan':{ 'phone':13966137218, 'addr':'上海市浦东新区源深路419号国际华城' }, 'lisi':{ 'phone':13511983857, 'addr':'上海市松江区人民南路323号' }, 'wanwu':{ 'phone':18339484093, 'addr':'上海市宝山区韶山路221号' } } #手机号及地址使用的描述性标签,用于打印输出 labels ={ 'phone':'phone number', 'addr':'address' } name =input("Your name :") #查询手机号还是地址 req=input('Phone number please enter \'p\';Address please enter \'a\'') if req == 'p': key='phone' elif req == 'a': key='addr' else: print("Sorry,your enter is wrong") if name in people: print ("%s 's %s is %s ." % (name,labels[key],people[name][key]))
3、字典基本方法
字典常用方法:clear,copy,fromkeys,get,items,keys,pop,popitem,setdefault,update,values
(1) clear 清空字典
x={} y=x x['key']='value' print(x) print(y) x.clear() print(y) """ {'key': 'value'} {'key': 'value'} {} """
(2) copy
#copy 返回一个具有相同键值对的新字典(浅复制) a={'a':1,'b':['2','3','4']} b=a.copy() #若在副本中修改值,原字典不受影响 b['a']='aaa' #若在副本中增删值,原字典会跟着改变 b['b'].remove('4') print(a) print(b) """ {'a': 1, 'b': ['2', '3']} {'a': 'aaa', 'b': ['2', '3']} """
#deepcopy 深复制,原字典改变,副本不变;副本改变,原字典也不变;原字典与副本都单独开辟了内存空间 from copy import deepcopy c={'a':1,'b':['2','3','4']} d=deepcopy(c) c["b"].append('5555555') print(c) print(d) print(id(c)) print(id(d)) e=deepcopy(c) e["b"].append("666666666666") print(c) print(e) print(id(c)) print(id(e))
"""
{'a': 1, 'b': ['2', '3', '4', '5555555']}
{'a': 1, 'b': ['2', '3', '4']}
38559608
38597040
{'a': 1, 'b': ['2', '3', '4', '5555555']}
{'a': 1, 'b': ['2', '3', '4', '5555555', '666666666666']}
38559608
38597112
"""
(3) fromkeys
#fromkeys 使用指定的键创建新字典,每个键对应的value默认为None print({}.fromkeys(['zhangsan','lisi'])) #{'zhangsan': None, 'lisi': None} #自己提供默认值 print({}.fromkeys(['zhangsan','lisi'],'666')) """ #fromkeys 使用指定的键创建新字典,每个键对应的value默认为None print({}.fromkeys(['zhangsan','lisi'])) #{'zhangsan': None, 'lisi': None} #自己提供默认值 print({}.fromkeys(['zhangsan','lisi'],'666')) """
(4)get
#get 根据key,获取value。key不存在时,返回None(可自定义默认值替换None)而不会报错b
age ={ 'zs':12, 'ls':15, 'ww':18 } print(age.get('ww')) print(age.get('zl')) print(age.get('zl','NA')) """ 18 None NA """
(5)items
#items 以列表的方式返回字典的所有键值对 pp ={ 'zs':12, 'ls':15, 'ww':18 } print(pp.items()) """ dict_items([('zs', 12), ('ls', 15), ('ww', 18)]) """
(6) keys values
#keys 以列表的形式返回字典的所有key;values 返回字典的所有values print(pp.keys()) print(pp.values()) """ dict_keys(['zs', 'ls', 'ww']) dict_values([12, 15, 18]) """
(7) pop
#pop 弹出(删除)字典中指定key的元素 pp.pop("zs") print(pp) pp.pop("ls") print(pp) """ {'ls': 15, 'ww': 18} {'ww': 18} """
(8) popitem
#popitem 随机弹出字典中的某个项 qq ={ 'zs': 12, 'ls': 15, 'ww': 18 } qq.popitem() print(qq) """ {'zs': 12, 'ls': 15} """
(9) setdefault
#setdefault 获取字典中某个Key的value,类似于get,若key不存在,则创建指定默认值 print("********************") t={} t.setdefault("name","zhangsan") print(t) print(t.setdefault("name"))
(10) update
#update 将两个字典合并,如果key相同,则更新原字典 m={ 'a':1, 'b':2 } n={ 'c':3, 'd':4 } m.update(n) print(m) d={ 'tittle':'Python Web Site', 'url':'http://www.python.org', 'changed':'DDD' } x={'tittle':'Python Language Website'} d.update(x) print(d) """ {'a': 1, 'b': 2, 'c': 3, 'd': 4} {'tittle
问题思考:请详细分析以下很“low”的代码。
x={} y=x print(x) print(y) x['a']=1 print(x) print(y) x={} print(x) print(y)
爱家,更要爱技术。