Python说文解字_杂谈07

 1. 深入dict

from collections.abc import Mapping,MutableMapping
# dict 属于mapping类型

a = {}
print(isinstance(a,MutableMapping))

2.常用方法:

a = {"bobby1":{"company":"imooc"},
     "bobby2:":{"company":"imooc"}}

# clear
# a.clear()

#copy,返回浅拷贝
# new_dict = a.copy()
# new_dict["bobby1"]["company"] = "imooc3"

# 深拷贝
# import copy
# new_dict = copy.deepcopy(a)
# new_dict["bobby1"]["company"] = "imooc3"

# fromkeys
new_list = ["bobby1","bobby2"]
new_dict = dict.fromkeys(new_list,{"company":"imooc"})

# get
# value = new_dict.get("bobby",{})
# print(value)

#items
# for key,value in new_dict.items():
#     print(key,value)

# setdefault
# 他对去调用D.get(k,d)同时D[k] 设置
default_value = new_dict.setdefault("bobby","imooc")
print(new_dict)

# update:
new_dict.update(bobby="imooc")
new_dict.update([("bobby","imooc")])
new_dict.update((("bobby","imooc"),))

3. dict的子类

# 不建议继承list和dict
class Mydict(dict):
    def __setitem__(self,key,value):
        super().__setitem__(key,value*2)

my_dict = Mydict(one=1)
my_dict["one"] = 1
print(my_dict)
# 建议用UserDict
from collections import UserDict

class Mydict(UserDict):
    def __setitem__(self,key,value):
        super().__setitem__(key,value*2)

my_dict = Mydict(one=1)
print(my_dict)
from collections import defaultdict

class Mydict(UserDict):
    def __setitem__(self,key,value):
        super().__setitem__(key,value*2)

my_dict = Mydict(one=1)
print(my_dict)

my_dict = defaultdict(dict)
my_value = my_dict["bobby"]

# __missing__方法,如果找不到某个key,那么实现一个keyvalue

  记住:其实setdefault里面实现了__missing__魔法函数,表示如果是找不到某个key,那么实现一个默认的keyvalue

3. set和frozenset

# set   集合  frozenset   不可变集合   无序  不重复
s = set('abcde')
s = set(['a','b','c'])
print(s)

# 初始化方法
s = {'a','b'}
print(type(s))


s2 = frozenset('abcde') # 不可变的类型,可以作为dict的key
print(s2)

  记住:和数学的操作一样,差集,交集,并集等。。

  记住:在去重上应用很高,性能很高。

  记住:还可以用:

for "c" in set:
    print ("i am in set")

  记住:这里就实现了__contain__方法

  记住:还有实现了__issubset__方法

4. dict和set他们背后实现的原理:

  1. dict的key或者set的值都是必须可以hash的,不可变对象都是可以hash的,str,fronzenset,tuple,自己实现的类的__hash__

  2. dict的内存花销大,但是查询速度快,自定义的对象或者Python内部的对象都使用dict包装的。

  3.dict的存储顺序和元素添加顺序有关。

  4.添加数据有可能改变已有数据的顺序。

  5.list和array是一种自增的方式,随着数据在增加,申请内存空间的动作不断操作。

  6.dict只有在内存空间少于1/3的时候才会去申请内存空间。 

原文地址:https://www.cnblogs.com/noah0532/p/10989826.html