Python中字典的基本用法
本文为南大张莉老师《用Python玩转数据》学习笔记
字典可以建立对象之间映射的关系,它是python中唯一内建的映射类型,字典中的每个元素是一个key-value对(键-值对),key可以是数字、字符串、元组等不可变的类型。字典中的值是无序的,仅仅和key有关。
一、创建字典
1.大括号,逗号分隔键值对,key和value之间可以用冒号
>>> a={'Wang':3000,'Liu':10000,'Li':200,'Zhang':4000}
以这种方式创建字典时,可使用fromkeys()函数,将所有的键放在一起,将它们共同的值放在后面,可将所有的值设置为默认值
>>> aDict={}.fromkeys(('Wang','Liu','Li','Zhang'),3000)
>>> aDict
{'Wang': 3000, 'Liu': 3000, 'Li': 3000, 'Zhang': 3000}
2.使用dict函数
example 1:
>>> info=[('Wang',3000),('Liu',10000),('Li',200),('Zhang',4000)]
>>> b=dict(info)
example 2:
>>> info1=[['Wang',3000],['Liu',10000],['Li',200],['Zhang',4000]]
>>> c=dict(info1)
example 3:
>>> d=dict(Wang=3000,Liu=10000,Li=200,Zhang=4000)
example 4:
>>> e=dict((('Lily',200),('Lucy',300)))
>>> e
{'Lily': 200, 'Lucy': 300}
只要元素和元素之间存在对应关系,就可以通过dict()把它们转成相应的key和value生成一个一个映射关系,即键值对。
此外,可通过zip()函数将两个列表的元素打包成一个字典,这在生成字典的过程中常常用到
>>> names=['Wang','Liu','Li','Zhang']
>>> salaries=[3000,10000,200,4000]
>>> dict(zip(names,salaries))
{'Wang': 3000, 'Liu': 10000, 'Li': 200, 'Zhang': 4000}
附:
对字典使用sorted()函数
>>> aDict={'Wang': 3000, 'Liu': 3000, 'Li': 3000, 'Zhang': 3000}
>>> sorted(aDict)
['Li', 'Liu', 'Wang', 'Zhang']
字典时无序存储的,其sorted的结果返回的是一个列表(key的内部存储的顺序),而不是字典
一个小例子:
将公司的简称和股价读出,组成字典:
IF=[('AXP','American Express Company','78.51'),\
('BA','The Boeing Company','184.76'),\
('CAT','Caterpillar Inc','96.39'),\
('CSCO','Cisco System Inc','33.71'),\
('CVX','Chevron Corporation','106.09')]
#法一:
aList=[]
bList=[]
for i in range(5):
aStr=IF[i][0]
bStr=IF[i][2]
aList.append(aStr)
bList.append(bStr)
aDict=dict(zip(aList,bList))
print(aDict)
#法二:
d={} #定义一个空字典
for item in IF:
d[item[0]]=item[2]
print(d)
二、字典的操作
1.字典的基本操作
(1)键值查找
>>> a={'Wang':3000,'Liu':10000,'Li':200,'Zhang':4000}
>>> a['Liu']
10000
(2)更新
>>> a={'Wang':3000,'Liu':10000,'Li':200,'Zhang':4000}
>>> a['Liu']=9999
>>> a
{'Wang': 3000, 'Liu': 9999, 'Li': 200, 'Zhang': 4000}
(3)添加
>>> a={'Wang': 3000, 'Liu': 9999, 'Li': 200, 'Zhang': 4000}
>>> a['Fu']=1000
>>> a
{'Wang': 3000, 'Liu': 9999, 'Li': 200, 'Zhang': 4000, 'Fu': 1000}
(4)成员判断
>>> a={'Wang': 3000, 'Liu': 9999, 'Li': 200, 'Zhang': 4000, 'Fu': 1000}
>>> 'Hi' in a
False
(5)删除成员
>>> a={'Wang': 3000, 'Liu': 9999, 'Li': 200, 'Zhang': 4000, 'Fu': 1000}
>>> del a['Fu']
>>> a
{'Wang': 3000, 'Liu': 9999, 'Li': 200, 'Zhang': 4000}
此外,还可通过字典的内建函数和方法来对字典的成员或字典本身进行各类操作.
2.字典常用的内建函数:
(1) dict(),
(2) len() 计算字典元素的个数
>>> a={'Wang': 3000, 'Liu': 9999, 'Li': 200, 'Zhang': 4000}
>>> len(a)
4
(3) hash() 判断某一个对象是不是可哈希的(是不是不可变的)
如果是可哈希的,它会出现哈希值
(对列表不可使用hash())
>>> a={'Wang': 3000, 'Liu': 9999, 'Li': 200, 'Zhang': 4000}
>>> hash('Wang')
-6470719400083728228
3.字典常用的方法:
(1) keys()
>>> a={'Wang':3000,'Liu':10000,'Li':200,'Zhang':4000}
>>> a.keys()
dict_keys(['Wang', 'Liu', 'Li', 'Zhang'])
(2) values()
>>> a={'Wang':3000,'Liu':10000,'Li':200,'Zhang':4000}
>>> a.values()
dict_values([3000, 10000, 200, 4000])
(3) items()方法可把字典中每对键和值组成一个元组,然后将其放回一个列表中返回
然后可对每一个键和值进行遍历
>>> a={'Wang':3000,'Liu':10000,'Li':200,'Zhang':4000}
>>> a.items()
dict_items([('Wang', 3000), ('Liu', 10000), ('Li', 200), ('Zhang', 4000)])
>>> for k,v in a.items():
print(k,v)
Wang 3000
Liu 10000
Li 200
Zhang 4000
(4) update()
快速整合两份信息表(原有信息表和更新信息表)
>>> a={'Wang':3000,'Liu':10000,'Li':200,'Zhang':4000}
>>> b={'Wang':4000,'Liu':90000,'Li':200,'Zhen':4500}
>>> a.update(b)
>>> a
{'Wang': 4000, 'Liu': 90000, 'Li': 200, 'Zhang': 4000, 'Zhen': 4500}
(5) get()
返回指定键的值,如果值不存在,则返回默认值None
>>> stock={'AXP':78.51,'BA':184.76}
>>> stock['AAA']
Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
stock['AAA']
KeyError: 'AAA'
>>> print(stock.get('AAA'))
None
(6) clear()
清空原始对象,并且清空对其进行复制的对象
>>> astock={'AXP':78.51,'BA':184.76}
>>> bstock=astock
>>> astock.clear()
>>> astock
{}
>>> bstock
{}
可对照下面的例子:
>>> astock={'AXP':78.51,'BA':184.76}
>>> bstock=astock #bstock指向和astock同一个对象
>>> astock={} #astock指向另一个对象,和bstock再无联系
>>> bstock
{'AXP': 78.51, 'BA': 184.76}
(7) pop()
弹出指定键的值
>>> stock={'AXP':78.51,'BA':184.76}
>>> stock.pop('AXP')
78.51
此外,字典的常用方法还有copy(),setdefault()
json模块
json格式是网络上非常流行的轻量级的数据交换格式,很多网站都在使用这种格式,其形式大致像这样:
{‘name’: ‘Liu’, ‘address’: {‘city’: ‘Beijing’, ‘street’: ‘Changle Road’}}
json是由一组一组的名称和值对组成,和字典具有相似性,可以像找字典的值一样,把它的值找到。
python中有json模块
json.dumps()可将字典或其他python数据结果转成json编码的字符串,若要还原,使用json.loads()函数即可
>>> import json
>>> json_str=json.dumps(x) #json编码
>>> json_str
'{"name": "Liu", "address": {"city": "Beijing", "street": "Changle Road"}}' #即为json编码的字符串
>>> json.loads(json_str) #还原
{'name': 'Liu', 'address': {'city': 'Beijing', 'street': 'Changle Road'}}
在web应用程序中,常常把很多对象组成一个字典,把它们编码成json格式文件,再把它们放在网络上,可使用json.load()对其进行解码
一个例子:搜索引擎关键字查询
网址中的q,wd是特征词
wd=%s (百度)
q=%us (Bing)
即为我们所要查询的关键词
>>> import requests
>>> keyword={'q':'Python dict'}
>>> r=requests.get('https://cn.bing.com/search',params=keyword)
>>> r.url
'https://cn.bing.com/search?q=Python+dict'
>>> print(r.text)
在Bing浏览器中进行检索,地址栏的网址和代码产生的是一样的
字典充当可变长关键字参数
元组可以充当可变长位置参数),形参用一个星号*表示;而字典充当可变长关键字参数,形参用两个星号表示
>>> def func(args1,*argst,**argsd):
print(args1)
print(argst)
print(argsd)
>>> func('hello','Wang','Liu','Li',a1=1,a2=2,a3=3)
hello
('Wang', 'Liu', 'Li')
{'a1': 1, 'a2': 2, 'a3': 3}