目录
文章目录
目录软件环境字典(Dictionary)创建一个字典对象简单的创建fromkey() 使用 keys 来创建字典查询查询字典中 key 映射的 valueget() 查询 Key 映射的 value,当 key 不存在时,返回默认值len(dictName)获取字典长度keys()列出dict的Keys列表values()列出dict的values列表添加字典项通过赋值为字典添加一个项通过setdefault()增加删除字典项del 语句,删除字典中key对应的一个项popitem() 将随机一个字典键值对弹出(删除并返回)pop()弹出key映射的valueclear()清空字典中的所有项修改简单的修改dict中key映射的value值update()更新字典字典的复制copy() 浅复制类型转换item() 将每个字典项,转化为Tuple和List的混合数据类型成员关系判断一个kay是否存在dict中使用成员关系运算符判断字典的遍历格式化输出value常见异常TypeError: object is not subscriptable软件环境
系统UbuntuKylin 14.04软件Python 2.7.3IPython 4.0.0字典(Dictionary)
字典数据类型使用键值对的映射关系来关联数据。
创建一个字典对象
简单的创建
In [18]: dic = {'name':'Jmilk','age':23,'city':'BJ'}
fromkey() 使用 keys 来创建字典
通过一个 keys 的序列来创建字典,可以指定 keys 映射的 value,默认为 None。
fromkeys(...)dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.v defaults to None.In [125]: newDic = {}.fromkeys(['name','age','city'],'not found')In [126]: newDicOut[126]: {'age': 'not found', 'city': 'not found', 'name': 'not found'}
查询
查询字典中 key 映射的 value
In [44]: dic['age']Out[44]: 23
get() 查询 Key 映射的 value,当 key 不存在时,返回默认值
自动添加(字典的默认值):自动添加是字典数据类型的特性,即使一个 Key 起初不存在于字典中,也可为 Key 分配一个值,以此来建立新的项。
get(...)D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.In [6]: dicOut[6]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}In [7]: dic.get('age',24)Out[7]: 23In [8]: dic.get('a',24)Out[8]: 24
若不使用get()函数去获取一个不存在的key对应的value时,会报错。
len(dictName)获取字典长度
len()是Python的内建函数,可以获取序列或字典的长度,即元素的个数。
len(...)len(object) -> integerReturn the number of items of a sequence or mapping.In [34]: len(dic)Out[34]: 3
keys()列出dict的Keys列表
keys(...)D.keys() -> list of D's keysIn [22]: dic.keys()Out[22]: ['city', 'age', 'name']
values()列出dict的values列表
values(...)D.values() -> list of D's valuesIn [23]: dic.values()Out[23]: ['BJ', 23, 'Jmilk']
添加字典项
通过赋值为字典添加一个项
格式:dictName[keyN] = valueN
In [25]: dicOut[25]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}In [27]: dic['sex'] = 'man'In [28]: dicOut[28]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk', 'sex': 'man'}
通过setdefault()增加
当key存在时,call D.get(k,d)方法,即获取key映射的value。当key不存在时,执行D[k]=d,即为dict增加一个新的元素。
setdefault(...)D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in DIn [25]: dicOut[25]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}In [26]: dic.setdefault('age',24)Out[26]: 23In [27]: dic.setdefault('sex','man')Out[27]: 'man'In [28]: dicOut[28]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk', 'sex': 'man'}
删除字典项
del 语句,删除字典中key对应的一个项
del语句可以操作所有的迭代器对象。
In [40]: dicOut[40]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}In [41]: del dic['age']In [42]: dicOut[42]: {'city': 'BJ', 'name': 'Jmilk'}
popitem() 将随机一个字典键值对弹出(删除并返回)
以tuple(k,v)的形式删除字典的一个元素,并返回。需要一个接受返回的对象。若字典为空,则报错。
popitem(...)D.popitem() -> (k, v), remove and return some (key, value) pair as a2-tuple; but raise KeyError if D is empty.In [32]: dicOut[32]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk', 'sex': 'man'}In [34]: dic.popitem()Out[34]: ('city', 'BJ')In [35]: dic.popitem()Out[35]: ('age', 23)
pop()弹出key映射的value
pop(...)D.pop(k[,d]) -> v, remove specified key and return the corresponding value.If key is not found, d is returned if given, otherwise KeyError is raisedIn [39]: dicOut[39]: {'name': 'Jmilk', 'sex': 'man'}In [40]: dic.pop('name')Out[40]: 'Jmilk'
一般情况下,当字典为空时调用了D.pop()方法的化会触发一个KeyError。但是也可以通过下面的调用方式来添加key不存在时的返回默认值。
当Key不存在时,返回默认值,避免报错:
In [20]: dicOut[20]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}In [21]: dic.pop('sex','man')Out[21]: 'man'
clear()清空字典中的所有项
清空所有项目,返回None。
clear(...)D.clear() -> None. Remove all items from D.In [58]: dicOut[58]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}In [59]: dic.clear()In [60]: dicOut[60]: {}
修改
简单的修改dict中key映射的value值
格式:```dictName[key] = newValue
In [50]: dic['city'] = 'GZ'In [51]: dicOut[51]: {'age': 23, 'city': 'GZ', 'name': 'Jmilk'}
update()更新字典
使用另一个字典来更新一个字典,通过匹配的key来更新value。
update(...)D.update([E, ]**F) -> None. Update D from dict/iterable E and F.If E present and has a .keys() method, does:for k in E: D[k] = E[k]If E present and lacks .keys() method, does:for (k, v) in E: D[k] = vIn either case, this is followed by: for k in F: D[k] = F[k]In [137]: dicOut[137]: {'age': 23, 'city': 'BJ', 'name': ['jmilk']}In [138]: newInfo = {'name':'chocolate','age':22,'city':'ZH'}In [139]: dic.update(newInfo)In [140]: dicOut[140]: {'age': 22, 'city': 'ZH', 'name': 'chocolate'}
当然,也可以只更新其中若干个value。
字典的复制
copy() 浅复制
字典的浅复制与List的浅复制类似,都只是对引用对象的copy。
In [107]: dic1 = dic.copy()In [108]: dic,dic1Out[108]: ({'age': 23, 'city': 'BJ', 'name': ['jmilk', 'chocolate']},{'age': 23, 'city': 'BJ', 'name': ['jmilk', 'chocolate']})In [109]: dic1['age'] = 24In [110]: dic,dic1Out[110]: ({'age': 23, 'city': 'BJ', 'name': ['jmilk', 'chocolate']},{'age': 24, 'city': 'BJ', 'name': ['jmilk', 'chocolate']})
注意:对浅copy得到的新字典中的value做替换操作(替换整个value),是不会影响到元字典的。但是如果对新字典中的value做了修改操作(修改其中一部分),就会影响到原字典。如下:
In [111]: dic1['name'].remove('chocolate')In [112]: dic,dic1Out[112]: ({'age': 23, 'city': 'BJ', 'name': ['jmilk']},{'age': 24, 'city': 'BJ', 'name': ['jmilk']})
因为两个key的id指向同一个数据对象,对数据对象做了修改(改变数据对象)后就会都受到影响。但替换(改变引用对象)整个value,即将新字典中key的id指向另一个数据对象,不会改变原数据对象。
深copy和浅copy的详细介绍,请参考:/jmilk/article/details/49560989
类型转换
item() 将每个字典项,转化为Tuple和List的混合数据类型
items(...)D.items() -> list of D's (key, value) pairs, as 2-tuplesIn [42]: dicOut[42]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}In [43]: dic.items()Out[43]: [('city', 'BJ'), ('age', 23), ('name', 'Jmilk')]In [44]: [x for param in dic for x in dic] #嵌套列表降维Out[44]: ['city', 'age', 'name', 'city', 'age', 'name', 'city', 'age', 'name']
因为返回的是List类型对象,所以可以使用索引操作符。
In [46]: dic.items()[0]Out[46]: ('city', 'BJ')In [48]: dic.items()[0][0]Out[48]: 'city'
由此可以看出,可以对一个对象做 操作,主要由对象的类型来决定。
成员关系
判断一个kay是否存在dict中
In [56]: dicOut[56]: {'age': 23, 'city': 'GZ', 'name': 'Jmilk'}In [57]: dic.has_key('age')Out[57]: True
True ⇒ key存在dict中
False ⇒ key不存在dict中
使用成员关系运算符判断
成员资格:'age' in dic
只能通过key的成员关系来判断。
In [45]: dicOut[45]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}In [46]: 'age' in dicOut[46]: TrueIn [47]: 'age' not in dicOut[47]: False
字典的遍历
In [62]: dicOut[62]: {'age': 23, 'city': 'GZ', 'name': 'Jmilk'}In [63]: for key_num,val_num in dic.items():....:print key_num,val_num....:city GZage 23name Jmilk
格式化输出value
通过格式化%(key)format
来输出映射的value
In [53]: dicOut[53]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}In [54]: print 'ple call me %(name)s,Thx!' % dicple call me Jmilk,Thx!In [55]: print 'I m %(age)d years old.' % dicI m 23 years old.
只要key in dict,就能使用任意的转换说明符。
常见异常
TypeError: object is not subscriptable
解析:实例不是一个 Dict 类型对象,所以不具有 subscriptable,无法通过字典索符 [] 进行引用。