gj6 深入python的set和dict
6.1 collections中的abc
from collections.abc import Mapping, MutableMapping
#dict属于mapping类型 a = {}
print (isinstance(a, MutableMapping))
# True
6.2 dict的常见用法
a = {"lewen1": {"company": "imooc"},
"lewen2": {"company": "imooc2"}
}
# clear Remove all items from D.
# a.clear()
# pass
# copy, 返回浅拷贝
new_dict = a.copy()
new_dict["lewen1"]["company"] = "imooc3" # 浅拷贝,只是拷贝了指向。这里修改会修改了a 中原来的值
print(new_dict)
print(a)
---
{'lewen1': {'company': 'imooc3'}, 'lewen2': {'company': 'imooc2'}}
{'lewen1': {'company': 'imooc3'}, 'lewen2': {'company': 'imooc2'}}
---
import copy
a = {"lewen1": {"company": "imooc"},
"lewen2": {"company": "imooc2"}
}
new_dict = copy.deepcopy(a) # 深拷贝,开辟独立的内存空间,并复制值
new_dict["lewen1"]["company"] = "imooc3" # 这里修改,并不会影响字典a的值
print(new_dict)
print(a)
---
{'lewen1': {'company': 'imooc3'}, 'lewen2': {'company': 'imooc2'}}
{'lewen1': {'company': 'imooc'}, 'lewen2': {'company': 'imooc2'}}
---
# formkeys
new_list = ["lewen1", "lewen2"]
new_dict = dict.fromkeys(new_list, {"company": "imooc"})
print(new_dict)
# new_dict["kevin"] # KeyError 不存在会抛异常
ret = new_dict.get("kevin","None") #
print(ret)
# items 方法
for key,value in new_dict.items():
print(key,value) ret_set = new_dict.setdefault("kevin","new mem") # 不存在key,就设置并返回值
print(ret_set)
print(new_dict)
new_dict.update( # update() 括号里面添加为可迭代对象
(("lewen", "imooc"),)
)
---
{'lewen1': {'company': 'imooc'}, 'lewen2': {'company': 'imooc'}}
None
lewen1 {'company': 'imooc'}
lewen2 {'company': 'imooc'}
new mem
{'lewen1': {'company': 'imooc'}, 'lewen2': {'company': 'imooc'}, 'kevin': 'new mem'}
6.3 dict的子类
#不建议继承list和dict
class Mydict(dict):
def __setitem__(self, key, value):
super().__setitem__(key, value*2) my_dict = Mydict(one=1) # value*2 没有生效
# my_dict["one"] = 1 # 生效了
print (my_dict)
{'one': 1}
---
from collections import UserDict
class Mydict(UserDict):
def __setitem__(self, key, value):
super().__setitem__(key, value*2) my_dict = Mydict(one=1)
# my_dict["one"] = 1
print (my_dict)
{'one': 2}
---
# defaultdict
from collections import defaultdict
my_dict = defaultdict(dict)
my_value = my_dict["bobby"] # 没有则返回空字典
print(my_value)
{}
6.4 set和frozenset
#set 集合 fronzenset (不可变集合) 无序, 不重复
s = set('abcdee')
print(s) s2 = set(['a','b','c','d','e'])
print(s2) s3 = {'a','b', 'c'}
print(type(s3)) s = frozenset("abcde") #frozenset 不可变,以作为dict的key
# 不能添加值
print(s)
# ---
{'a', 'e', 'c', 'd', 'b'}
{'a', 'e', 'c', 'd', 'b'}
<class 'set'>
frozenset({'a', 'e', 'c', 'd', 'b'})
# ---
#向set添加数据
s = set('abcdee')
another_set = set("cef")
s.update(another_set)
print(s) re_set = s.difference(another_set) # {'b', 'd', 'a'}
re_set = s - another_set # {'b', 'd', 'a'}
re_set = s & another_set # {'c', 'f', 'e'}
re_set = s | another_set # {'a', 'f', 'c', 'e', 'd', 'b'} #set性能很高
# | & - #集合运算
print(re_set) print (s.issubset(re_set))
if "c" in re_set:
print ("i am in set")
# ---
{'a', 'f', 'e', 'c', 'd', 'b'}
{'a', 'f', 'c', 'e', 'd', 'b'}
True
i am in set
6.5 dict和set实现原理
from random import randint def load_list_data(total_nums, target_nums):
"""
从文件中读取数据,以list的方式返回
:param total_nums: 读取的数量
:param target_nums: 需要查询的数据的数量
"""
all_data = []
target_data = []
file_name = "D:\电子书\Python面试宝典Version8.1.pdf"
with open(file_name, encoding="utf8", mode="r") as f_open:
for count, line in enumerate(f_open):
if count < total_nums:
all_data.append(line)
else:
break for x in range(target_nums):
random_index = randint(0, total_nums)
if all_data[random_index] not in target_data:
target_data.append(all_data[random_index])
if len(target_data) == target_nums:
break return all_data, target_data def load_dict_data(total_nums, target_nums):
"""
从文件中读取数据,以dict的方式返回
:param total_nums: 读取的数量
:param target_nums: 需要查询的数据的数量
"""
all_data = {}
target_data = []
file_name = "D:\电子书\Python面试宝典Version8.1.pdf"
with open(file_name, encoding="utf8", mode="r") as f_open:
for count, line in enumerate(f_open):
if count < total_nums:
all_data[line] = 0
else:
break
all_data_list = list(all_data)
for x in range(target_nums):
random_index = randint(0, total_nums-1)
if all_data_list[random_index] not in target_data:
target_data.append(all_data_list[random_index])
if len(target_data) == target_nums:
break return all_data, target_data def find_test(all_data, target_data):
#测试运行时间
test_times = 100
total_times = 0
import time
for i in range(test_times):
find = 0
start_time = time.time()
for data in target_data:
if data in all_data:
find += 1
last_time = time.time() - start_time
total_times += last_time
return total_times/test_times if __name__ == "__main__":
# all_data, target_data = load_list_data(10000, 1000)
# all_data, target_data = load_list_data(100000, 1000)
# all_data, target_data = load_list_data(1000000, 1000) # all_data, target_data = load_dict_data(10000, 1000)
# all_data, target_data = load_dict_data(100000, 1000)
# all_data, target_data = load_dict_data(1000000, 1000)
all_data, target_data = load_dict_data(2000000, 1000)
last_time = find_test(all_data, target_data)
view
#dict查找的性能远远大于list
#在list中随着list数据的增大 查找时间会增大
#在dict中查找元素不会随着dict的增大而增大
print(last_time) #1.dict的key或者set的值 都必须是可以hash的
#不可变对象 都是可hash的, str, fronzenset, tuple,自己实现的类 __hash__
#2. dict的内存花销大(有大量空余的表元),但是查询速度快, 自定义的对象 或者python内部的对象都是用dict包装的
# 3. dict的存储顺序和元素添加顺序有关
# 4. 添加数据有可能改变已有数据的顺序

哈希冲突后重新计算位置
在剩余空间小于三分之一时,申请更大的空间,然后数据搬迁,有可能会改变顺序

gj6 深入python的set和dict的更多相关文章
- python基础之字典dict和集合set
作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7043642.html python基础之字典dict和集合set 字典dic ...
- python入门14 字典dict
字典dict是无序的key:value格式的数据序列 #coding:utf-8 #/usr/bin/python """ 2018-11-11 dinghanhua 字 ...
- Python基础——字典(dict)
由键-值对构建的集合. 创建 dic1={} type(dic1) dic2=dict() type(dic2) 初始化 dic2={'hello':123,'world':456,'python': ...
- 05-深入python的set和dict
一.深入python的set和dict 1.1.dict的abc继承关系 from collections.abc import Mapping,MutableMapping #dict属于mappi ...
- python何时用list,dict,set
从读取的角度来讲: 看是用来随机读取(查询)还是连续读取. list数组集中存放,连续读取效率高(具体还没测试,理论上应该如此). dict散列表,使用hash计算存放的位置,随机读取效率高. 随机读 ...
- Python中list,tuple,dict,set的区别和用法
Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set.这里对他们进行一个简明的总结. List ...
- python日常-list and dict
什么是list: list 觉得算是python日常编程中用的最多的python自带的数据结构了.但是python重的list跟其他语言中的并不相同. 少年..不知道你听说过python中的appen ...
- Python~list,tuple^_^dict,set
tuple~(小括号) list~[中括号] 和list比较,dict有以下几个特点: dict~{‘key’:value,} set~set([1,2,3]) tuple一旦初始化就不能修改~指向不 ...
- Python之什么是dict
我们已经知道,list 和 tuple 可以用来表示顺序集合,例如,班里同学的名字: ['Adam', 'Lisa', 'Bart'] 或者考试的成绩列表: [95, 85, 59] 但是,要根据名字 ...
随机推荐
- 前端-HTML练习题
本小节重点: 熟练使用div+span布局,知道div和span的语义化的意思 熟悉对div.ul.li.span.a.img.table.form.input标签有深刻的认知,初期也了解他们,知道他 ...
- 19 网络编程--Socket 套接字方法
1.Socket(也称套接字)介绍 socket这个东东干的事情,就是帮你把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装好了 ,你只需要调用几行代码,就可以给别的机器发消息 ...
- 8 python time$datetime
1.表示时间的方式 (1)时间戳 时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. 我们运行“type(time.time())” ...
- UI5-文档-4.24-Filtering
在此步骤中,我们为产品列表添加一个搜索字段,并定义一个表示搜索项的过滤器.搜索时,列表会自动更新,只显示与搜索项匹配的项. Preview A search field is displayed ab ...
- 如何将Wav文件做到EXE文件里
1)编写.RC文件 ..RC文件是资源的源文件,编译器也就编译这个文件,生成.RES的资源文件 首先在我们的项目子目录中建立一个纯文本文件,起名叫Sound.rc,文件中 有一行,内容为: SOUND ...
- JavaScript实现AOP(面向切面编程,装饰者模式)
什么是AOP? AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计.安全控制.异常处理等.把这些功能抽离出来之后, 再通过“动态织入 ...
- Cannot create inner bean '(inner bean)#67f903b5' of typ
严重: Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error crea ...
- 参数错误导致bug
1.网站参数与数据库参数名字不一致(大小写). 2.参数漏掉一个字母(characterno写成了charaterno).
- sublimetext 2 编译文件带input时 提示 EOFError: EOF when reading a line
昨天在网下下载了个什么sublimetxt 2 的破解版,然后让我折腾了半天,没错 ,就是因为这个 EOFError: EOF when reading a line错误让我搞的半死.怨自己,贪图中文 ...
- C++的编译与连接
编译器的任务是把我们人类通常能够读懂的文本形式的 C 语言文件转化成计算机能明白的目标文件.1. 预编译生成的仍然是.c文件1)把"include"的文件拷贝到要编译的源文件中. ...