[笔记] Python核心编程 第七章

一个字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也包括其他容器类型。
字典类型中的数据是无序排列的。

可以通过fromkeys()函数来创建一个“默认”字典
>>> dict_ = {}.fromkeys(('x', 'y'), -1)
>>> dict_
{'y': -1, 'x': -1}
>>> dict_ = {}.fromkeys(('foo', 'bar'))
>>> dict_
{'foo': None, 'bar': None}

用来检测字典中是否包含某个key,可以用has_key()方法,但这个方法已经逐渐被in或者not in操作符取代,所以不再推荐使用。

字典支持所有的标准操作符,除了连接(+)和重复(*)。

用cmp()内建函数比较字典的原则如下,按顺序比较:
1.比较字典长度
2.如果字典长度相同,那就按照字典的键比较;键比较的顺序和keys()方法返回键的顺序相同。
3.如果两个字典的长度相同且它们的键值也完全匹配,则用字典中的每个相同的键所对应的值进行比较。
4.到此为止,每个字典的长度相同,键值相同,每个键对应的值也相同,则字典完全相同。

用工厂方法dict()从另一个字典生成一个新的字典时,新生成的字典是原来字典对象的浅拷贝。和列表类型的工厂方法list()一样。
另外采用工厂方法dict()生成新的字典的速度比用dict.copy()方法慢,推荐用dict.copy()方法

方法名字 操作
dict.clear() 删除字典中的所有元素
dict.copy() 返回字典的一个浅拷贝副本
dict.fromkeys(seq,val=None) 创建并返回一个新字典,以seq中的元素作为该字典的key,val做该字典中所有key的初始值
dict.get(key, default=None) 返回字典中key对应的value,如果字典中不存在key,则返回default的值
dict.has_key(key) 如果字典中存在key,则返回True,反之则返回False
dict.items() 返回一个包含字典中键-值对元组的列表
dict.keys() 返回一个包含字典中键的列表
dict.iter*() 方法iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代器,而不是一个列表
dict.pop(key[,default]) 和方法get()类似。如果字典中key存在,删除并返回key对应的值;如果key不存在,且没有给出default的值,则引发KeyError异常
dict.setdefault(key, default=None) 和方法get()相似,如果字典中不存在key,则进行dict[key]=default赋值操作
dict.update(dict2) 将字典dict2的键值对添加到字典dict中
dict.values() 返回一个包含字典中所有值的列表

字典的内建方法

方法名字 操作
dict.clear() 删除字典中的所有元素
dict.copy() 返回字典的一个浅拷贝副本
dict.fromkeys(seq,val=None) 创建并返回一个新字典,以seq中的元素作为该字典的key,val做该字典中所有key的初始值
dict.get(key, default=None) 返回字典中key对应的value,如果字典中不存在key,则返回default的值
dict.has_key(key) 如果字典中存在key,则返回True,反之则返回False
dict.items() 返回一个包含字典中键-值对元组的列表
dict.keys() 返回一个包含字典中键的列表
dict.iter*() 方法iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代器,而不是一个列表
dict.pop(key[,default]) 和方法get()类似。如果字典中key存在,删除并返回key对应的值;如果key不存在,且没有给出default的值,则引发KeyError异常
dict.setdefault(key, default=None) 和方法get()相似,如果字典中不存在key,则进行dict[key]=default赋值操作
dict.update(dict2) 将字典dict2的键值对添加到字典dict中
dict.values() 返回一个包含字典中所有值的列表

dict.update()方法,字典中原有的key和新添加的字典的key重复,那么重复的key对应的值将被新添加的字典的值给覆盖;
>>> dict1 = {'host': 'earth', 'post': 80}
>>> dict2 = {'host': 'venus', 'server': 'http'}
>>> dict1.update(dict2)
>>> dict1
{'server': 'http', 'post': 80, 'host': 'venus'}

字典的键必须是可哈希的!
所有不可变类型都是可哈希的,除了元组,元组只有在只包含数字和字符串这样的不可变类型时才可以作为字典中有效的key。
同时不是所有的可变对象都是不可哈希的,比如实现了__hash__()方法的类,只要__hash__()返回一个不可变类型,那么它就是一个可哈希的对象,可以用作字典的键。

集合是一组无序排列的可哈希的值,注意集合的元素都必须是可哈希的,所以list和dict不能作为集合的元素。

集合分成两种不同的类型,可变集合(set)和不可变集合(frozenset)。
可变集合可以添加或者删除元素,而不可变集合则不允许这么做。另外可变集合不可哈希,所以不能作为字典的key,但不可变集合是可哈希的,所以它可以作为字典的key。

函数/方法名 等价操作符 说明
所有集合类型
len(s) 集合长度,集合s中元素的个数
set([obj]) 可变集合工厂函数;obj必须是支持迭代的,由obj中的元素创建集合,否则创建一个空的集合
frozenset([obj]) 不可变集合工厂函数;和set()类似,但它返回的是一个不可变集合
obj in s 成员测试:obj是s中的一个元素吗?
obj not in s 非成员测试:obj不是s中的一个元素吗?
s == t 等价测试:测试s和t是否具有相同的元素?
s != t 不等价测试: 与==相反
s < t (严格意义上)子集测试;s!=t而且s中所有的元素都是t的成员
s.issubset(t) s <= t 子集测试(允许不严格意义上的子集):s中所有的元素都是t的成员
s > t (严格意义上)超集测试:s!=t而且t中所有的元素都是s的成员
s.issuperset(t) s >= t 超集测试(允许不严格意义上的超集):t中所有的元素都是s的成员
s.union(t) s | t 合并操作:s或者t中的元素
s.intersection(t) s & t 交集操作:s和t中的元素
s.difference(t) s - t 差分操作:s中的元素,而不是t中的元素
s.symmetric_difference(t) s ^ t 对称差分操作:s或t中的元素,但不是s和t共有的元素
s.copy() 复制操作:返回s的浅拷贝副本
仅用于可变集合
s.update(t) s |= t (Union)修改操作:将t中的成员添加到s
s.intersection_update(t) s &= t 交集修改操作:s中仅包括s和t中共有的成员
s.difference_update(t) s -= t 差修改操作:s中包括仅属于s但不属于t的成员
s.symmetric_difference_update(t) s ^= t 对称差分修改操作:s中包括仅属于s或者仅属于t的成员
s.add(obj) 加操作:将obj添加到s
s.remove(obj) 删除操作:将obj从s中删除;如果s中不存在obj,将引发KeyError
s.discard(obj) 丢弃操作:remove()的友好版本——如果s中存在obj,从s中删除它;如果obj不存在,也不会引发KeyError异常
s.pop() Pop操作:移除并返回s中的任意一个元素
s.clear() 清除操作:移除s中所有的元素

集合类型总结表

函数/方法名 等价操作符 说明
所有集合类型
len(s) 集合长度,集合s中元素的个数
set([obj]) 可变集合工厂函数;obj必须是支持迭代的,由obj中的元素创建集合,否则创建一个空的集合
frozenset([obj]) 不可变集合工厂函数;和set()类似,但它返回的是一个不可变集合
obj in s 成员测试:obj是s中的一个元素吗?
obj not in s 非成员测试:obj不是s中的一个元素吗?
s == t 等价测试:测试s和t是否具有相同的元素?
s != t 不等价测试: 与==相反
s < t (严格意义上)子集测试;s!=t而且s中所有的元素都是t的成员
s.issubset(t) s <= t 子集测试(允许不严格意义上的子集):s中所有的元素都是t的成员
s > t (严格意义上)超集测试:s!=t而且t中所有的元素都是s的成员
s.issuperset(t) s >= t 超集测试(允许不严格意义上的超集):t中所有的元素都是s的成员
s.union(t) s | t 合并操作:s或者t中的元素
s.intersection(t) s & t 交集操作:s和t中的元素
s.difference(t) s - t 差分操作:s中的元素,而不是t中的元素
s.symmetric_difference(t) s ^ t 对称差分操作:s或t中的元素,但不是s和t共有的元素
s.copy() 复制操作:返回s的浅拷贝副本
仅用于可变集合
s.update(t) s |= t (Union)修改操作:将t中的成员添加到s
s.intersection_update(t) s &= t 交集修改操作:s中仅包括s和t中共有的成员
s.difference_update(t) s -= t 差修改操作:s中包括仅属于s但不属于t的成员
s.symmetric_difference_update(t) s ^= t 对称差分修改操作:s中包括仅属于s或者仅属于t的成员
s.add(obj) 加操作:将obj添加到s
s.remove(obj) 删除操作:将obj从s中删除;如果s中不存在obj,将引发KeyError
s.discard(obj) 丢弃操作:remove()的友好版本——如果s中存在obj,从s中删除它;如果obj不存在,也不会引发KeyError异常
s.pop() Pop操作:移除并返回s中的任意一个元素
s.clear() 清除操作:移除s中所有的元素

对于集合类型操作符(|, &, -, ^)
如果左右两个操作数的类型相同,即都是可变集合或者不可变集合,则产生的结果类型是相同的,但如果左右两个操作数的类型不相同(左操作数是set,右操作数是frozenset,或者相反情况),则所产生的结果类型与左操作数相同。
>>> s = set([1,2,3])
>>> t = frozenset('abc')
>>> s ^ t
set({1, 2, 3, 'a', 'b', 'c'})
>>> t ^ s
frozenset({1, 2, 3, 'a', 'b', 'c'})

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

推荐阅读更多精彩内容

  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,918评论 17 410
  • Python简介 Python历史 Python 是由 Guido van Rossum 在八十年代末和九十年代初...
    莫名其妙的一生阅读 1,040评论 0 2
  • 有关字典: 字典与列表类似,不过字典中的顺序无关紧要,字典中每个元素拥有与之对应的互不相同的键,需要通过键来访问元...
    码农小杨阅读 1,104评论 0 3
  • 这是我的软肋,我知道。曾经会在听到一句话,听到某一首歌,泪如雨下,依然会在某一个深夜,无征兆的,泪崩。 可是,哭过...
    阿丹_3阅读 591评论 0 1
  • 说了挺多的电影,休息一下,今天来说说跟书有关的事吧。 从小到大,能让我爸妈觉得特别自豪的事情之一是,孩童时期,在大...
    怀澍阅读 2,657评论 2 5