Python基本语法_基本数据类型_字典类型详解

目录

软件环境

  • 系统
  • UbuntuKylin 14.04
  • 软件
  • Python 2.7.3
  • IPython 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]: newDic
Out[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]: dic
Out[6]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}

In [7]: dic.get('age',24)
Out[7]: 23

In [8]: dic.get('a',24)
Out[8]: 24

若不使用get()函数去获取一个不存在的key对应的value时,会报错。

len(dictName)获取字典长度

len()是Python的内建函数,可以获取序列或字典的长度,即元素的个数。

len(...)
len(object) -> integer
Return 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 keys

In [22]: dic.keys()
Out[22]: ['city', 'age', 'name']

values()列出dict的values列表

values(...)
D.values() -> list of D's values


In [23]: dic.values()
Out[23]: ['BJ', 23, 'Jmilk']

添加字典项

通过赋值为字典添加一个项

格式dictName[keyN] = valueN

In [25]: dic
Out[25]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}

In [27]: dic['sex'] = 'man'

In [28]: dic
Out[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 D

In [25]: dic
Out[25]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}

In [26]: dic.setdefault('age',24)
Out[26]: 23

In [27]: dic.setdefault('sex','man')
Out[27]: 'man'

In [28]: dic
Out[28]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk', 'sex': 'man'}

删除字典项

del 语句,删除字典中key对应的一个项

del语句可以操作所有的迭代器对象。

In [40]: dic
Out[40]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}

In [41]: del dic['age']

In [42]: dic
Out[42]: {'city': 'BJ', 'name': 'Jmilk'}

popitem() 将随机一个字典键值对弹出(删除并返回)

以tuple(k,v)的形式删除字典的一个元素,并返回。需要一个接受返回的对象。若字典为空,则报错。

popitem(...)
    D.popitem() -> (k, v), remove and return some (key, value) pair as a
    2-tuple; but raise KeyError if D is empty.

In [32]: dic
Out[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 raised

In [39]: dic
Out[39]: {'name': 'Jmilk', 'sex': 'man'}

In [40]: dic.pop('name')
Out[40]: 'Jmilk'

一般情况下,当字典为空时调用了D.pop()方法的化会触发一个KeyError。但是也可以通过下面的调用方式来添加key不存在时的返回默认值。
当Key不存在时,返回默认值,避免报错

In [20]: dic
Out[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]: dic
Out[58]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}

In [59]: dic.clear()

In [60]: dic
Out[60]: {}

修改

简单的修改dict中key映射的value值

格式:```dictName[key] = newValue

In [50]: dic['city'] = 'GZ'

In [51]: dic
Out[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] = v
    In either case, this is followed by: for k in F: D[k] = F[k]
    
In [137]: dic
Out[137]: {'age': 23, 'city': 'BJ', 'name': ['jmilk']}

In [138]: newInfo = {'name':'chocolate','age':22,'city':'ZH'}

In [139]: dic.update(newInfo)

In [140]: dic
Out[140]: {'age': 22, 'city': 'ZH', 'name': 'chocolate'}

当然,也可以只更新其中若干个value。

字典的复制

copy() 浅复制

字典的浅复制与List的浅复制类似,都只是对引用对象的copy。

In [107]: dic1 = dic.copy()

In [108]: dic,dic1
Out[108]: 
({'age': 23, 'city': 'BJ', 'name': ['jmilk', 'chocolate']},
 {'age': 23, 'city': 'BJ', 'name': ['jmilk', 'chocolate']})

In [109]: dic1['age'] = 24

In [110]: dic,dic1
Out[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,dic1
Out[112]: 
({'age': 23, 'city': 'BJ', 'name': ['jmilk']},
 {'age': 24, 'city': 'BJ', 'name': ['jmilk']})

因为两个key的id指向同一个数据对象,对数据对象做了修改(改变数据对象)后就会都受到影响。但替换(改变引用对象)整个value,即将新字典中key的id指向另一个数据对象,不会改变原数据对象。
深copy和浅copy的详细介绍,请参考:http://blog.csdn.net/jmilk/article/details/49560989

类型转换

item() 将每个字典项,转化为Tuple和List的混合数据类型

items(...)
    D.items() -> list of D's (key, value) pairs, as 2-tuples

In [42]: dic
Out[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]: dic
Out[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]: dic
Out[45]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}

In [46]: 'age' in dic
Out[46]: True

In [47]: 'age' not in dic
Out[47]: False

字典的遍历

In [62]: dic
Out[62]: {'age': 23, 'city': 'GZ', 'name': 'Jmilk'}

In [63]: for key_num,val_num in dic.items():
   ....:     print key_num,val_num
   ....:     
city GZ
age 23
name Jmilk                                               

格式化输出value

通过格式化%(key)format来输出映射的value

In [53]: dic
Out[53]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}

In [54]: print 'ple call me %(name)s,Thx!' % dic
ple call me Jmilk,Thx!

In [55]: print 'I m %(age)d years old.' % dic
I m 23 years old.

只要key in dict,就能使用任意的转换说明符。

常见异常

TypeError: object is not subscriptable

解析:实例不是一个 Dict 类型对象,所以不具有 subscriptable,无法通过字典索符 [] 进行引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范桂飓

文章对您有帮助就请一键三连:)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值