python字典

1. 简介

只有可散列的数据类型才能作为字典的键,原子不可变数据类型(str、bytes 和数值类型)都是可散列类型,frozenset 也是
可散列的,因为根据其定义,frozenset 里只能容纳可散列类型。

a = dict(one=1,two=2,three=3)

b = {'one':1,'two':2,'three':3}

set1 = {'one','two','three'}

set2 = {1,2,3}

c = dict(zip(set1,set2))   # zip() 函数的返回结果为 [('one', 1), ('three', 3), ('two', 2)] type is list

d = dict({'three':3,'one':1,'two':2})

a == b == c == d   # 返回值True

除了这些字面句法和灵活的构造方法之外,字典推导(dict comprehension)也可以用来建造新 dict.

2.字典推导式

image.png

3.字典上可进行的操作

len(a)                        # 返回字典长度
a[key]                       # 返回字段key值为key的元素值,如果key 不在 字典中,报KeyError。
a[key] = value           # 设置a[key] 的值为value
iter(a)                        # 返回一个迭代器,元素由字典所有的键组成
key in a // key not in a   # a 中key 存在返回True,否则False// 相反,存在返回False,不存在返回True
e = a.copy()                 # 浅拷贝
f = fromkeys(seq[, value])         # 以seq为键值创建一个新的字典,values设置为value 该方法为字典类的方法
f = a.fromkeys(set1,None)       # 返回以set1元素为key值的 None为键值的字典 :{1: None, 2: None, 3: None}
value1 = get(key[,default])       # 如果key存在,返回key的值否则,返回default的值,default 默认为None.
element_list = items()              # 返回以键值对为元素的列表。[(key,value),....]
ele_iter  = iteritems()                 #返回以键值对为元素的迭代器。
iterkey() /// itervalues()           #........
keys()      ///value()                 # 返回一个列表,元素为字典的键/////值
pop(key[, default]) # 如果key 在字典中移除,并返回他的值,如果给出default,返回default。如果default未给,并且key不在字典中,报KeyError.
popitem()                   # 移除并返回任意键值对。
setdefault(key[, default])   # 如果key 在字典中,返回他的值,如果不在,插入到字典中,键为key,值为default 并返回default,default默认为None
update([other])                 # 更新一个字典,加入other中的键值对。
a.update({'four':4})            # a =   {'three': 3, 'two': 1, 'one': 1,'four':4}

4. defaultdict:处理找不到的键的一个选择

创建 defaultdict 对象的时候,就需要给它配置一个为找不到的键创造默认值的方法。具体而言,在实例化一个 defaultdict 的时候,需要给构造方法提供一个可调用对象,这个可调用对象会在 getitem 碰到找不到的键的时候被调用,让 getitem
回某种默认值。比如,我们新建了这样一个字典:
dd = defaultdict(list),如果键 'new-key' 在 dd中还不存在的话,表达式 dd['new-key'] 会按照以下的步骤来行事

    1. 调用 list() 来建立一个新列表。
  • 2 把这个新列表作为值,'new-key' 作为它的键,放到 dd 中。
  • 3 返回这个列表的引用。
import collections
dd = collections.defaultdict(list)
print dd['zhao']      #输出值为[]
pring dd                # defaultdict(<type 'list'>, { 'zhao': []})

上述例子中,

1.使用list作为default_factory 来创建一个defaultdict,它是用来生产默认值的可调用对象。
2.如果创建defaultdict的时候没有指定default_factory,查询不存在的键会触发KeyError.
3.defaultdict里面的default-factory只会在_getitem_里面被调用,在其他方法里面完全不会发挥作用。比如,上面例子中,dd['zhao']会调用default_factory,但是,dd.get('xxx')不回调用,而是返回None.

而这个用来生成默认值的可调用对象存放在名为 default_factory 的实例属性里.如果在创建 defaultdict 的时候没有指定default_factory,查询不存在的键会触发KeyError.所有这一切背后的功臣其实是特殊方法 missing。它会在 defaultdict 遇到找不到的键的时候调用 default_factory,而实际上这个特性是所有映射类型都可以选择去支持的。

5.字典的变种

5.1.collections.Counter

这个映射类型会给键准备一个整数计数器。每次更新一个键的时候都会增加这个计数器。所以这个类型可以用来给可散列表对象计数,或者是当成多重集来用——多重集合就是集合里的元素可以出现不止一次。Counter 实现了 + 和 - 运算符用来合并记录,还有像 most_common([n]) 这类很有用的方法。most_common([n]) 会按照次序返回映射里最常见的 n 个键和它们的计数。

import collections
ct = collections.Counter(['zhao','zhao','linpeng','peng','peng','peng'])
print ct   #output:Counter({'peng': 3, 'zhao': 2, 'linpeng': 1})
print ct.most_common(2)   # output: [('peng', 3), ('zhao', 2)]

5.2.collections.OrderedDict

这个类型在添加键的时候会保持顺序,因此键的迭代次序总是一致的。OrderedDict 的 popitem 方法默认删除并返回的是字典里的最后一个元素,但是如果像 my_odict.popitem(last=False) 这样调用它,那么它删除并返回第一个被添加进去的元素。

5.3.collections.ChainMap

该类型可以容纳数个不同的映射对象,然后在进行键查找操作的时候,这些对象会被当作一个整体被逐个查找,直到键被找到为止。这个功能在给有嵌套作用域的语言做解释器的时候很有用,可以用一个映射对象来代表一个作用域的上下文。

5.4.colllections.UserDict

这个类其实就是把标准 dict 用纯 Python 又实现了一遍。跟 OrderedDict、ChainMap 和 Counter 这些开箱即用的类型不同,UserDict 是让用户继承写子类的。更倾向于从 UserDict 而不是从 dict 继承的主要原因是,后者有时会在某些方法的实现上走一些捷径,导致我们不得不在它的子类中重写这些方法,但是 UserDict 就不会带来这些问题.
  UserDict 并不是 dict 的子类,但是 UserDict 有一个叫作 data 的属性,是 dict 的实例,这个属性实际上是 UserDict 最终存储数据的地方。

5.5.最后介绍一种不可变映射对象,type 模块中的MappingProxyType

  types 模块中引入了一个封装类名叫 MappingProxyType。如果给这个类一个映射,它会返回一个只读的映射视图。虽然是个只读视图,但是它是动态的。这意味着如果对原映射做出了改动,我们通过这个视图可以观察到,但是无法通过这个视图对原映射做出修改。

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 一、字典基本操作 基本语法:dict = {'ob1':'computer', 'ob2':'mouse', 'o...
    古佛青灯度流年阅读 2,623评论 0 1
  • 1 字典基础操作 1.1 创建字典 通过{}操作符创建字典aDict = {'name':'ke', 'age':...
    Ke爺阅读 575评论 0 0
  • 本篇将介绍Python里面的字典,更多内容请参考:Python学习指南 Python是什么? Python内置了字...
    小七奇奇阅读 1,419评论 0 5
  • 学习了 Python 基本的字典操作后,学习这些进阶操作,让写出的代码更加优雅简洁和 pythonic 。 与字...
    追梦人物阅读 12,836评论 10 70
  • 1. 字典的一些知识点 字典特性可变、可存储任意类型对象、无序 字典的生成?直接用dict 字典的排序?sorte...
    海螺上的斑点阅读 390评论 0 0