字典是Python中唯一内建的映射类型。

字典中的值并没有特殊的顺序,但是都存储在一个特定的键(Key)里。键可以是数字、字符串甚至是元组。

字典的使用


某些情况下,字典比列表更加适用:

  • 表征游戏棋盘的状态,每个键都是由坐标组成的元组;
  • 存储文件修改次数,用文件名作为键;
  • 数字电话/地址簿

创建和使用字典


字典由多个键及与其对应的值构成的对组成。示例:

>>> phonebook = {'}
>>> phonebook['a']
'

上例中,字母是键,数字是值。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一堆大括号括起来。空字典仅由两个大括号组成。

  1. dict 函数
    可以用dict 函数,通过其它映射(比如其它字典)或者(键,值)这样的序列对建立字典。

    >>> items = [('name','Gumby'),('age',42)]
    >>> d = dict(items)
    >>> d
    {'age': 42, 'name': 'Gumby'}
    >>> d['name']
    'Gumby'

    dict 函数也可以通过关键字参数来创建字典:

    >>> d = dict(name = 'Python', level = 5)
    >>> d
    {'name': 'Python', 'level': 5}
  2. 基本字典操作
    字典的基本行为在很多方面与序列(sequence)类似:
    ①len(d)返回d中项(键-值对)的数量;
    ②d[k]返回关联到键k上的值;
    ③d[k]=v 将值v关联到键k上;
    ④del d[k]删除键为k的项;
    ⑤k in d检查d中是否含有键为k的项。
    字典和列表的区别:
    ①键类型: 字典的键不一定为整形数据。
    ②自动添加:即使那个键起初在字典中并不存在,也可以为它分片一个值,这样字典会建立新的项。而列表不能关联到索引范围外。
    ③成员资格:表达式 k in d(d为字典)查找的是键,而不是值。表达式v in l(l为列表)则用来查找值,而不是索引
  3. 字典的格式化字符串
    >>> phonebook = {'}
    >>> "Beth's phone number is %(Beth)s"%phonebook
    "Beth's phone number is 110"

字典方法


  1. clear
    clear 方法清字典中所有的项。

    >>> d = {'a':'b'}
    >>> d.clear()
    >>> d
    {}
  2. copy
    copy方法返回一个具有相同键-值对的新字典(这个方法实现的是浅复制(shallw copy))
    >>> x = {'username':'admin','machine':['foo','bar','baz']}
    >>> y = x.copy()
    >>> x
    {'username': 'admin', 'machine': ['foo', 'bar', 'baz']}
    >>> y['username'] = 'tester'
    >>> y['machine'].remove('foo')
    >>> x
    {'username': 'admin', 'machine': ['bar', 'baz']}
    >>> y
    {'username': 'tester', 'machine': ['bar', 'baz']}

    可以看到,在副本中替换值的时候,原始字典不受影响,如果修改了某个值,原始的字典也会改变。

    避免这个问题的一种方法就是使用深复制(deep copy)

    >>> from copy import deepcopy
    >>> d = {}
    >>> d['names'] = ['Alfred','Bertrand']
    >>> c = d.copy()
    >>> dc = deepcopy(d)
    >>> d['names'].append('Python')
    >>> c
    {'names': ['Alfred', 'Bertrand', 'Python']}
    >>> d
    {'names': ['Alfred', 'Bertrand', 'Python']}
    >>> dc
    {'names': ['Alfred', 'Bertrand']}
  3. fromkeys
    fromkeys方法使用给定的键建立新的字典,每个键默认对应的值为None
    >>> {}.fromkeys(['name','age'])
    {'age': None, 'name': None}

    如果不想使用None作为默认值,也可以自己提供默认值:

    >>> {}.fromkeys(['name','age'],'(defalut value)')
    {'age': '(defalut value)', 'name': '(defalut value)'}
  4. get
    当使用get访问一个不存在的键时,没有任何异常,而得到了None值。还可以自定义“默认的值”,替换None
    >>> d = {}
    >>> d.get('name','n/a')
    'n/a'
  5. has_key
    has_key 方法可以检查字典中是否含有给出的键。表达式d.has_key(k),相当于k in d
    >>> d = {}
    >>> d.has_key('name')
    False
    >>> d['name'] = 'py'
    >>> d.has_key('name')
    True
  6. items 和 iteritems
    items 方法将所有的字典以列表方式返回,这些列表项中的每一项都来自于(键,值)。但是项在返回时没有特殊的顺序。
    >>> d = {'title':'Python','body':'tester'}
    >>> d.items()
    [('body', 'tester'), ('title', 'Python')]

    iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表:

    >>> it = d.iteritems()
    >>> it
    <dictionary-itemiterator object at 0x012199F0>
    >>> list(it)
    [('body', 'tester'), ('title', 'Python')]
  7. keys 和 iterkeys
    keys方法将字典中的键以列表的形式返回,iterkeys则返回针对键的迭代器。
  8. pop
    pop方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除。
    >>> d = {'a':'b','c':'d'}
    >>> d.pop('c')
    'd'
    >>> d
    {'a': 'b'}
  9. popitem
    popitem弹出随机的项,因为字典没有“最后的元素”或者其他关于顺序的概念。
    >>> d = {'a':'b','c':'d','e':'f','g':'h'}
    >>> d.popitem()
    ('a', 'b')
    >>> d
    {'c': 'd', 'e': 'f', 'g': 'h'}
  10. setdefault
    setdefault 方法在某种程度上类似于get方法,就是能获得与给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值。
    >>> d = {}
    >>> d.setdefault('name','n/a')
    'n/a'
    >>> d
    {'name': 'n/a'}
    >>> d['name'] = 'Python'
    >>> d.setdefault('name','n/a')
    'Python'
    >>> d
    {'name': 'Python'}

    可以看到,当键不存在的时候,setdefault返回默认值并且相应地更新字典。如果键存在,那么就返回与其对应的值,但不改变字典

  11. update
    >>> d = {'title':'python','body':'tester','footer':'fighting'}
    >>> x = {'title':'position'}
    >>> d.update(x)
    >>> d
    {'body': 'tester', 'footer': 'fighting', 'title': 'position'}
  12. values 和 itervalues
    >>> d = {}
    >>> d[1] = 1
    >>> d[2] = 2
    >>> d[3] = 3
    >>> d[4] = 4
    >>> d[5] = 1
    >>> d.values()
    [1, 2, 3, 4, 1]

    values方法以列表的形式返回字典中的值。返回值列表可以包含重复的值。

 小结:

映射:映射可以使用任何不变对象标识元素,最 常用的类型是字符串和元组。

《Python基础教程(第二版)》学习笔记 -> 第四章 字典的更多相关文章

  1. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

    第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...

  2. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

    第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...

  3. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第12章 | 图形用户界面

    Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ ...

  4. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

    打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...

  5. Jquery基础教程第二版学习记录

    本文仅为个人jquery基础的学习,简单的记录以备忘. 在线手册:http://www.php100.com/manual/jquery/第一章:jquery入门基础jquery知识:jquery能做 ...

  6. 第二章、元组和列表(python基础教程第二版 )

    最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...

  7. python基础教程第二版 第一章

    1.模块导入python以增强其功能的扩展:三种方式实现 (1). >>> Import math >>> math.floor(32.9) 32.0 #按照 模块 ...

  8. &lt;&lt;Python基础课程&gt;&gt;学习笔记 | 文章13章 | 数据库支持

    备注:本章介绍了比较简单,只是比较使用样品,主要假设是把握连接,利用数据库.和SQLite做演示样本 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,如今已经 ...

  9. python cookbook第三版学习笔记十四:类和对象(五)代理类以及内存回收

    代理类: 代理类的作用其实有继承有些类似,如果你想将某个实例的属性访问代理到内部另外一个实例中去,可以用继承也可以用代理.来看下代理的应用: class A:     def spam(self,x) ...

随机推荐

  1. poj 2728 Desert King (最小比例生成树)

    http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissio ...

  2. spring +hibernate 启动优化【转】

    最近在负责一个大项目,项目组成员包括项目经理大概10个人左右.项目技术用struts+spring+hibernate实现.项目的规模相对来说是比较大的,总共有10大模块,每个大模块又分为有十几个.甚 ...

  3. ExtJS4.2学习(四)Grid表格中文排序问题(转)

    鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-07/173.html --------------- ...

  4. 通过PLSQL Developer导入SQL文件

    1.点击“工具” 2.选中其中的“导入表(L)”,在按下图所示操作: PLSQL Developer会自动运行相关命令,在Tables中刷新即可看到新导入的表.

  5. 团体程序设计天梯赛-练习集L2-009. 抢红包

    L2-009. 抢红包 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 没有人没抢过红包吧…… 这里给出N个人之间互相发红包.抢 ...

  6. 手机开发类型jquery的框架Zepto(API)

    Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api. 如果你会用jquery,那么你也会用zepto. http://www.html-5.cn/M ...

  7. VS2008调试技巧收集备用

    VS2005调试技巧集合 http://blog.csdn.net/rainylin/archive/2007/09/06/1775125.aspx 下面有从浅入深的6个问题,您可以尝试回答一下 一个 ...

  8. android dialog 原来dialog对话框也有自己的按键监听事件 onKeyDown方法

    探讨在一个activity中按menu键时弹出自己定义的dialog(自定义菜单对话框)时,再按一次手机的menu键发现这个自定义的dialog菜单并没有关闭,原来是这个dialog内部也有onKey ...

  9. MetadataType的使用

    MetadataType的使用,MVC的Model层数据验证指定要与数据模型类关联的元数据类 using System.ComponentModel.DataAnnotations; //指定要与数据 ...

  10. Time.deltaTime 含义和应用

    第一種:使用Time.deltaTime 一秒內從第1個Frame到最後一個Frame所花的時間,所以不管電腦是一秒跑60格或者一秒30格.24格,值都會趨近於一. 就結果而言,deltaTime是為 ...