[Python笔记05] 深入dict和set

1.dict的abc继承关系

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

a = {}

#isinstance实例
#dict并没有继承MutableMapping,只是实现了当中的一些魔法方法
print(isinstance(a, MutableMapping))

2.dict的常用方法

(1)clear
它的作用是将字典清空

a = {"bobby1":{"company":"tencent1"},
     "bobby2": {"company": "tencent2"}
     }

print(a)
print(a.clear())

输出结果

{'bobby1': {'company': 'tencent1'}, 'bobby2': {'company': 'tencent2'}}
None

(2)浅拷贝
浅拷贝是并没有真正拷贝,而是引用原值。

a = {"bobby1":{"company":"tencent1"},
     "bobby2": {"company": "tencent2"}
     }
     
new_dict = a.copy()
new_dict["bobby1"]["company"] = "tencent3"
print(a)
print(new_dict)

输出结果

{'bobby1': {'company': 'tencent3'}, 'bobby2': {'company': 'tencent2'}}
{'bobby1': {'company': 'tencent3'}, 'bobby2': {'company': 'tencent2'}}

(3)深拷贝
深拷贝真正将原值拷贝了一份。

import copy

a = {"bobby1":{"company":"tencent1"},
     "bobby2": {"company": "tencent2"}
     }

new_dict = copy.deepcopy(a)
new_dict["bobby1"]["company"] = "tencent3"
print(new_dict)
print(a)

输出结果

{'bobby1': {'company': 'tencent3'}, 'bobby2': {'company': 'tencent2'}}
{'bobby1': {'company': 'tencent1'}, 'bobby2': {'company': 'tencent2'}}

(4)fromkeys
fromkeys 将可迭代对象转为dict

new_list = ["bobby1", "bobby2"]

new_dict = dict.fromkeys(new_list, {"company": "tencent"})
print(new_dict)

输出结果

{'bobby1': {'company': 'tencent'}, 'bobby2': {'company': 'tencent'}}

(5)update

new_dict = {'bobby1': "taobao",
            'bobby2': "baidu"}
new_dict.update((("bobby3","tencent"),))
print(new_dict)
new_dict.update(booby4="bilibili")
print(new_dict)

输出结果

{'bobby1': 'taobao', 'bobby2': 'baidu', 'bobby3': 'tencent'}
{'bobby1': 'taobao', 'bobby2': 'baidu', 'bobby3': 'tencent', 'booby4': 'bilibili'}

(6)get
获取值,如果没用返回一个空字典。

new_dict = {'bobby1': "taobao",
            'bobby2': "baidu"}

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

输出结果

{}

(7)setdefault

new_dict = {'bobby1': "taobao",
            'bobby2': "baidu"}
default_value= new_dict.setdefault("bobby9","apple")
print(new_dict)

输出结果

{'bobby1': 'taobao', 'bobby2': 'baidu', 'bobby9': 'apple'}

(8)items()

new_dict = {'bobby1': "taobao",
            'bobby2': "baidu"}

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

输出结果

bobby1 taobao
bobby2 baidu

3.dict的子类

(1)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)

输出结果

{'one': 2}

不建议继承dict和list

(2)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)

输出结果

{'one': 2}

(3)defaultdict

from collections import defaultdict

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

输出结果

defaultdict(<class 'dict'>, {'bobby': {}})
{}

4.set和frozenset

  • set 集合
  • fronzenset 不可变集合
  • 无序,不重复

(1)初始化一个set

s = set('abcdee')
print(s)

s = set(['a','b','c','d','e'])
print(s)

s = frozenset("abcde") #frozenset可以作为dict的key
print(s)

输出结果

{'e', 'c', 'd', 'a', 'b'}
{'e', 'c', 'd', 'a', 'b'}
frozenset({'e', 'c', 'd', 'a', 'b'})

(2)集合运算

s = set('abcdee')
another_set = set("cef")
reset = s.difference(another_set)  #差集
print(reset)

reset = s - another_set  #差集
print(reset)

reset = s & another_set  #取交集
print(reset)

reset = s | another_set  #去并集
print(reset)

print(s.issubset(reset))    #s是不是reset的子集

输出结果

{'a', 'b', 'd'}
{'a', 'b', 'd'}
{'e', 'c'}
{'b', 'd', 'a', 'f', 'e', 'c'}
True

5.dict和set的实现原理

dict和set的存储都使用了哈希表,大大加快了查询速度。

哈希表
在这里插入图片描述
哈希表的查找
在这里插入图片描述

  1. dict查找的性能远远大于list
  2. 在list中随着list数据的增大,查找时间会增大
  3. 在dict中查找元素不会随着dict的增大而增大
  4. dict的key或者set的值 都必须是可以hash的
  5. 不可变对象都是可hash的, str, frozenset, tuple,包含__ hash __的自己实现的类
  6. dict的内存花销大,但是查询速度快, 自定义的对象或者python内部的对象都是用dict包装的
  7. dict的存储顺序和元素添加顺序有关
  8. 添加数据有可能改变已有数据的顺序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值