详解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实现二分查找算法实例
May 26 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
Python基于PycURL实现POST的方法
Jul 25 Python
python 把数据 json格式输出的实例代码
Oct 31 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
Django框架模型简单介绍与使用分析
Jul 18 Python
手写一个python迭代器过程详解
Aug 27 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
利用pyshp包给shapefile文件添加字段的实例
Dec 06 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
Linux下ZendOptimizer的安装与配置方法
2007/04/12 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
php无限级分类实现方法分析
2016/10/19 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
Python魔术方法详解
2015/02/14 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python 专题一 函数的基础知识
2017/03/16 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
wxPython实现带颜色的进度条
2019/11/19 Python
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
幼儿园美术教学反思
2014/01/31 职场文书
消防安全检查制度
2014/02/04 职场文书
出生证明公证书
2014/04/09 职场文书
销售活动策划方案
2014/08/26 职场文书
团队拓展活动方案
2014/08/28 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
2019暑假学生安全口号
2019/06/27 职场文书