详解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 相关文章推荐
python人人网登录应用实例
Sep 26 Python
tensorflow实现简单的卷积网络
May 24 Python
pytorch permute维度转换方法
Dec 14 Python
使用python绘制二元函数图像的实例
Feb 12 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
Feb 13 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
Keras自定义IOU方式
Jun 10 Python
Python基于pillow库实现生成图片水印
Sep 14 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
Python环境配置实现pip加速过程解析
Nov 27 Python
Opencv 图片的OCR识别的实战示例
Mar 02 Python
Python日志模块logging用法
Jun 05 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
操作Oracle的php类
2006/10/09 PHP
php中cookie的作用域
2008/03/27 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
php头像上传预览实例代码
2017/05/02 PHP
php源码的使用方法讲解
2019/09/26 PHP
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
微信小程序实现全国机场索引列表
2018/01/31 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
python使用json序列化datetime类型实例解析
2018/02/11 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
浅谈django channels 路由误导
2020/05/28 Python
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
电大自我鉴定范文
2013/10/01 职场文书
大学生标准推荐信范文
2013/11/25 职场文书
学校招生宣传广告词
2014/03/19 职场文书
万能检讨书
2015/01/27 职场文书
教师节班会主持词
2015/07/06 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
教师个人教学反思
2016/02/23 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis