发布于2019-10-28 16:43 阅读(1244) 评论(0) 点赞(11) 收藏(1)
本章内容的大纲如下:
• 常见的字典方法
• 如何处理查找不到的键
• 标准库中 dict 类型的变种
• set 和 frozenset 类型
• 散列表的工作原理
• 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的顺序,等等)
collections.abc模块中有Mapping和MutableMapping两个抽象基类,作用是给dict或其他类似的映射类型定义接口,还有可以用与isinstance()判断某个数据是否是映射类型
标准库中所有映射类型都是利用dict实现了,限制是只有hashable的数据类型才可以作为映射的key
tt=(1,2,(30,40))
print(hash(tt)) # sucess
tl=(1,2,[30,40])
print(hash(tl)) # TypeError: unhashable type: '
Called by built-in function hash() and for operations on members of hashed collections including set, frozenset, and dict.
class ClassA():
def __init__(self):
self.name='jason'
a1=ClassA()
a2=ClassA()
print(a1==a2, a1 is a2, hash(a1)==hash(a2)) # False False False
a2=a1
print(a1==a1, a1 is a2, hash(a1)==hash(a2)) # True True True
class ClassA():
def __init__(self):
self.name='jason'
def __hash__(self):
print('ClassA Hash method')
return hash(self.name)
a1=ClassA()
a2=ClassA()
print(a2.__hash__)
dic={}
dic[a1]=1
dic[a2]=2
print(dic)
# <bound method ClassA.__hash__ of <__main__.ClassA object at 0x000001283708D160>>
# ClassA Hash method
# ClassA Hash method
# {<__main__.ClassA object at 0x000001283708D438>: 1, <__main__.ClassA object at 0x000001283708D160>: 2}
class ClassA():
def __init__(self):
self.name='jason'
def __eq__(self, other):
print('ClassA Eq method')
return self.name==other.name
a1=ClassA()
a2=ClassA()
print(a2.__hash__) # None
dic={}
dic[a1]=1 # TypeError: unhashable type: 'ClassA'
dic[a2]=2
print(dic)
class ClassA():
def __init__(self):
self.name='jason'
def __hash__(self):
print('ClassA Hash method')
return hash(self.name)
def __eq__(self, other):
print('ClassA Eq method')
return self.name==other.name
a1=ClassA()
a2=ClassA()
print(a2.__hash__)
dic={}
dic[a1]=1
dic[a2]=2
print(dic)
# <bound method ClassA.__hash__ of <__main__.ClassA object at 0x000001EEFFE1D470>>
# ClassA Hash method
# ClassA Hash method
# ClassA Eq method
# {<__main__.ClassA object at 0x000001EEFFE1D160>: 2}
class ClassA():
def __init__(self):
self.name='jason'
def __hash__(self):
print('ClassA Hash method')
return hash(self.name)
def __eq__(self, other):
print('ClassA Eq method')
# return self.name==other.name
return self.name=='mike'
a1=ClassA()
a2=ClassA()
print(a2.__hash__)
dic={}
dic[a1]=1
dic[a2]=2
print(dic)
# <bound method ClassA.__hash__ of <__main__.ClassA object at 0x00000201586FD4E0>>
# ClassA Hash method
# ClassA Hash method
# ClassA Eq method
# {<__main__.ClassA object at 0x00000201586FD470>: 1, <__main__.ClassA object at 0x00000201586FD4E0>: 2}
跟列表推导式类似
实现key跟value的互换:dic={value,key for key,value in other_dic.items()}
展示了dict、collections.defaultdict、collections.OrdereDict的方法列表
有时候为了方便起见,就算某个键在映射里不存在,我们也希望在通过这个键读取值的
时候能得到一个默认值。有两个途径能帮我们达到这个目的,一个是通过 defaultdict 这
个类型而不是普通的 dict,另一个是给自己定义一个 dict 的子类,然后在子类中实现
__missing__ 方法。
from collections import ChainMap
dicA={'a':1,'b':2}
dicB={'b':3,'c':4}
cm=ChainMap(dicA,dicB)
print(cm)# ChainMap({'a': 1, 'b': 2}, {'b': 3, 'c': 4})
print(cm['b']) # 2
cm.pop('b')
print(cm) # ChainMap({'a': 1}, {'b': 3, 'c': 4})
print(dicA) # {'a': 1}
print(cm['b']) # 3
cm.pop('c') # KeyError: "Key not found in the first mapping: 'c'"
from collections import Counter
ct=Counter('abcdefg')
print(ct)
ct.update('aaaabbddd')
print(ct)
print(ct.most_common(2))
# Counter({'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1, 'f': 1, 'g': 1})
# Counter({'a': 5, 'd': 4, 'b': 3, 'c': 1, 'e': 1, 'f': 1, 'g': 1})
# [('a', 5), ('d', 4)]
UserDict并不是dict的子类,更像是对dict的一个封装,UserDict有一个data属性,是dict实例,实际上data是数据最终存储的地方,我们构建映射类继承UserDict而不是dict,可以避免dict隐式调用自身的某些方法
不可变映射类型意思是指用户能读取映射的值,但不能添加新key或修改value值
from types import MappingProxyType
d={'a':1}
mp=MappingProxyType(d)
print(mp)# {'a': 1}
print(mp['a']) # 1
# mp['b']=2 # TypeError: 'mappingproxy' object does not support item assignment
# mp['a']=3 # TypeError: 'mappingproxy' object does not support item assignment
d['a']=4
print(mp) # {'a': 4}
集合中的元素必须是hashable的,set类型本身不是hashable的,但是frozenset可以,因此可以创建一个包含不同frozenset的set
集合的运算 集合a、b a|b返回合集 a&b返回交集,a-b返回差集
集合推导,跟字典推导类似
s={key for key in my_dict.keys()}
集合的函数列举
dict和set背后都是用散列表
给予散列表实现的dict和set有以下特点
作者:磨子舒
链接:https://www.pythonheidong.com/blog/article/147271/6d65fec376745c06391a/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!