详解Python字典小结


Posted in Python onOctober 20, 2018

字典(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等。

访问字典里的值

把相应的键放入熟悉的方括弧,如下实例:

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};

print "dict['Name']: ", dict['Name'];
print "dict['Age']: ", dict['Age'];
#以上实例输出结果:
#dict['Name']: Zara
#dict['Age']: 7

如果用字典里没有的键访问数据,会输出错误如下:

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};

print "dict['Alice']: ", dict['Alice'];

以上实例输出结果:

#KeyError: 'Alice'[/code]

修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};

dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School"; # Add new entry

 
print "dict['Age']: ", dict['Age'];
print "dict['School']: ", dict['School'];
#以上实例输出结果:
#dict['Age']: 8
#dict['School']: DPS School

删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。

显示删除一个字典用del命令,如下实例:

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};

del dict['Name']; # 删除键是'Name'的条目
dict.clear();   # 清空词典所有条目
del dict ;    # 删除词典

print "dict['Age']: ", dict['Age'];
print "dict['School']: ", dict['School'];
#但这会引发一个异常,因为用del后字典不再存在:
dict['Age']:

字典内置函数&方法

Python字典包含了以下内置函数:

cmp(dict1, dict2) #比较两个字典元素。
len(dict)       #计算字典元素个数,即键的总数。
str(dict)       #输出字典可打印的字符串表示。
type(variable)   #返回输入的变量类型,如果变量是字典就返回字典类型。

Python字典包含了以下内置方法:

radiansdict.clear()  #删除字典内所有元素
radiansdict.copy()  #返回一个字典的浅复制
radiansdict.fromkeys()  #创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
radiansdict.get(key, default=None)  #返回指定键的值,如果值不在字典中返回default值
radiansdict.has_key(key)  #如果键在字典dict里返回true,否则返回false
radiansdict.items()  #以列表返回可遍历的(键, 值) 元组数组
radiansdict.keys()  #以列表返回一个字典所有的键
radiansdict.setdefault(key, default=None)  #和get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default
radiansdict.update(dict2)  #把字典dict2的键/值对更新到dict里
radiansdict.values()  #以列表返回字典中的所有值

字典练习代码

print('''|---欢迎进入通讯录程序---|
|---1、 查询联系人资料---|
|---2、 插入新的联系人---|
|---3、 删除已有联系人---|
|---4、 退出通讯录程序---|''')
addressBook={}#定义通讯录
while 1:
  temp=input('请输入指令代码:')
  if not temp.isdigit():
    print("输入的指令错误,请按照提示输入")
    continue
  item=int(temp)#转换为数字
  if item==4:
    print("|---感谢使用通讯录程序---|")
    break
  name = input("请输入联系人姓名:")
  if item==1:
    if name in addressBook:
      print(name,':',addressBook[name])
      continue
    else:
      print("该联系人不存在!")
  if item==2:
    if name in addressBook:
      print("您输入的姓名在通讯录中已存在-->>",name,":",addressBook[name])
      isEdit=input("是否修改联系人资料(Y/N):")
      if isEdit=='Y':
        userphone = input("请输入联系人电话:")
        addressBook[name]=userphone
        print("联系人修改成功")
        continue
      else:
        continue
    else:
      userphone=input("请输入联系人电话:")
      addressBook[name]=userphone
      print("联系人加入成功!")
      continue

  if item==3:
    if name in addressBook:
      del addressBook[name]
      print("删除成功!")
      continue
    else:
      print("联系人不存在")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
go语言计算两个时间的时间差方法
Mar 13 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
Django2.1.3 中间件使用详解
Nov 26 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
解决django前后端分离csrf验证的问题
Feb 03 Python
详解Python字典的操作
Mar 04 Python
Python实现带下标索引的遍历操作示例
May 30 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
在Python dataframe中出生日期转化为年龄的实现方法
Oct 20 #Python
Django中的ajax请求
Oct 19 #Python
Tesserocr库的正确安装方式
Oct 19 #Python
Python中Proxypool库的安装与配置
Oct 19 #Python
在cmder下安装ipython以及环境的搭建
Oct 19 #Python
破解安装Pycharm的方法
Oct 19 #Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 #Python
You might like
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
简单的php文件上传(实例)
2013/10/27 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
PHP读取word文档的方法分析【基于COM组件】
2017/08/01 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
Python调用C++程序的方法详解
2017/01/24 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
python抽取指定url页面的title方法
2018/05/11 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
新闻专业毕业生英文求职信
2014/03/19 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
nginx七层负载均衡配置详解
2022/07/15 Servers