字典(dict)结构是Python中常用的数据结构,笔者结合自己的实际使用经验,对字典方面的相关知识做个小结,希望能对读者一些启发~
创建字典
常见的字典创建方法就是先建立一个空字典,然后逐一添加键(key)和值(value),比如创建字典person={'name':'Tome', 'age':22, 'city':'Shanghai, 'ID': '073569'},可以使用以下代码:
person = {}
person['name'] = 'Tom'
person['age'] = 22
person['city'] = 'Shanghai'
person['ID'] = '073569'
print(person)
输出结果为:
{'name': 'Tom', 'age': 22, 'city': 'Shanghai', 'ID': '073569'}
这样的创建方式简单原始,代码不够简洁优雅。我们用zip函数,来简单快捷地创建这个字典:
attrs = ['name', 'age', 'city', 'ID']
values = ['Tom', 22, 'Shanghai', '073569']
person = dict(zip(attrs, values))
print(person)
输出结果与原先代码一致。
遍历字典
在实际应用中,我们常常需要遍历字典,实现的方法可参考以下代码:
attrs = ['name', 'age', 'city', 'ID']
values = ['Tom', 22, 'Shanghai', '073569']
person = dict(zip(attrs, values))
for key, value in person.items():
print('Key:%-6s, Value:%s'%(key, value))
输出结果为:
Key:name , Value:Tom
Key:age , Value:22
Key:city , Value:Shanghai
Key:ID , Value:073569
对调键值对
在实际应用中,有时候我们需要查找字典中某个值(value)对应的键(key),遍历字典是一种选择,对调键值对是另一种选择。对调键值对的实现代码如下:
attrs = ['name', 'age', 'city', 'ID']
values = ['Tom', 22, 'Shanghai', '073569']
person = dict(zip(attrs, values))
print('对调前:')
print(person)
Person = {v:k for k,v in person.items()}
print('对调后:')
print(Person)
输出结果为:
对调前:
{'name': 'Tom', 'age': 22, 'city': 'Shanghai', 'ID': '073569'}
对调后:
{'Tom': 'name', 22: 'age', 'Shanghai': 'city', '073569': 'ID'}
有序字典OrderedDict
Python中的字典是无序的,其取出来的键是无序的,因为它是按照hash来储存的。有时候,我们需要字典的条目(items)或键(keys)是有序储存的,这时候可以使用collections
模块中的OrderedDict
,它是一种有序的字典结构。
示例代码如下(Python版本为3.5.2):
from collections import OrderedDict
d = {}
d['Tom']='A'
d['Jack']='B'
d['Leo']='C'
d['Alex']='D'
print('无序字典(dict):')
for k,v in d.items():
print(k,v)
d1 = OrderedDict()
d1['Tom']='A'
d1['Jack']='B'
d1['Leo']='C'
d1['Alex']='D'
print('\n有序字典(OrderedDict):')
for k,v in d1.items():
print(k,v)
输出的结果为:
无序字典(dict):
Leo C
Jack B
Tom A
Alex D
有序字典(OrderedDict):
Tom A
Jack B
Leo C
Alex D
默认字典collections.defaultdict
collections.defaultdict
是Python内建dict
类的一个子类,第一个参数为default_factory属性提供初始值,默认为None
。它覆盖一个方法并添加一个可写实例变量。它的其他功能与dict
相同,但会为一个不存在的键提供默认值,从而避免KeyError
异常。
我们以统计列表中单词的词频为例,展示collections.defaultdict
的优势。
一般情形下,我们统计列表中的单词词频代码为:
words = ['sun', 'moon', 'star', 'star',\
'star', 'moon', 'sun', 'star']
freq_dict = {}
for word in words:
if word not in freq_dict.keys():
freq_dict[word] = 1
else:
freq_dict[word] += 1
for key, val in freq_dict.items():
print(key, val)
输出结果如下:
sun 2
moon 2
star 4
使用collections.defaultdict
,代码可以优化:
from collections import defaultdict
words = ['sun', 'moon', 'star', 'star',\
'star', 'moon', 'sun', 'star']
freq_dict = defaultdict(int)
for word in words:
freq_dict[word] += 1
for key, val in freq_dict.items():
print(key, val)
其它默认初始值可以为set,list,dict等。
注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~