二. dict的常用方法
1. fromkeys把可迭代的对象转变为dict
基本语法:dict.fromkeys(可迭代对象作为keys,默认值作为value)
new_list = ["name1", "name2"]
new_dict = dict.fromkeys(new_list, 34)
print(new_dict)
输出如下
{'name1': 34, 'name2': 34}
2. clear,清空字典中数据
a = {"name1": "jack", "name2": "jane"}
print(a)
a.clear()
print(a)
输出如下
{'name2': 'jane', 'name1': 'jack'}
{}
3. copy(这里是浅拷贝)
a = {"name1": "jack", "name2": "jane"}
print(a)
b = a.copy()
print(b)
# 修改a的值后,b也会跟着改变;同样如果修改b,a也会相应改变
a["name1"] = "hong"
print(a)
b = a.copy()
print(b)
输出如下
{'name2': 'jane', 'name1': 'jack'}
{'name2': 'jane', 'name1': 'jack'}
{'name2': 'jane', 'name1': 'hong'}
{'name2': 'jane', 'name1': 'hong'}
4. get,避免字典中keyerror异常
语法:a.get(键名,默认值)如果字典a中没有某个键名,就返回默认值
a = {"name1": "jack", "name2": "jane"}
value = a.get("name3", "not exist")
print(value)
输出如下
5. setdefault(),和get()相似,不同的是如果没有某个键名,会把此键名和默认值加入到字典中
a = {"name1": "jack", "name2": "jane"}
# 没有指定键名时
a.setdefault("name3", "not exist")
print(a)
# 存在此键名时
b=setdefault("name1", "not exist")
print(b)
输出如下
{'name2': 'jane', 'name3': 'not exist', 'name1': 'jack'}
jack
6. update(), 可用于添加字典元素
a = {"name1": "jack", "name2": "jane"}
# 直接添加字典方式
a.update({"name3": "hong"})
print(a)
# 使用参数名方式
a.update(name4="lilei", name5="mei")
print(a)
# 使用list嵌套tuple方式,同样的tuple也可以嵌套tuple
a.update([("name6", "tiger"), ("name7", "monkey")])
print(a)
输出如下
{'name2': 'jane', 'name1': 'jack', 'name3': 'hong'}
{'name2': 'jane', 'name1': 'jack', 'name4': 'lilei', 'name5': 'mei', 'name3': 'hong'}
{'name6': 'tiger', 'name1': 'jack', 'name4': 'lilei', 'name3': 'hong', 'name7': 'monkey', 'name2': 'jane', 'name5': 'mei'}
三. set和frozenset(不可变集合)
特点:元素不会重复,无序性,里面的对象需要是可迭代,使用hash方式能很高
frosenset无法使用add函数添加值
1. 初始化方法
# 使用set关键字
s1 = set('abc')
#使用{}
s2 = {'a', 'b'}
print(type(s1), type(s2))
输出
<class 'set'> <class 'set'>
2. 添加元素方式
# 使用add()函数
s1 = set('abc')
s1.add('d')
print(s1)
# 使用update()函数
s2 = set('xy')
s1.update(s2)
print(s1)
输出
{'a', 'c', 'd', 'b'}
{'b', 'a', 'x', 'c', 'y', 'd'}
3. difference()函数来求两个集合的差集
s1 = set('abc')
s2 = set('cd')
# 相当于s1 - s2
re_set = s1.difference(s2)
print(re_set)
输出结果如下
注意:difference()函数会返回一个新值,不会修改原数据
4. 集合的并集,交集
s1 = set('abc')
s2 = set('cd')
# 交集
re_set1 = s1 & s2
# 并集
re_set2 = s1 | s2
print(re_set1, re_set2)
输出结果如下
{'c'} {'c', 'a', 'b', 'd'}
5. issubset()判断集合A是否为集合B的子集
s1 = set('abc')
s2 = set('c')
print(s2.issubset(s1))
输出结果为True
四. dict和set的内部实现原理
1. list和dict的性能比较
1)dict的查找性能远大于list
2)在list中随着list数据量的增大,查找相同数据量的时间也会增大
3)在dict中随着dict数据量的增大,查找相同数据量的时间不怎么受影响
2. hash表数据存储实现图
1)右侧是hash表的存储结构,是一个数组,使用了一段连续的内存空间
2)字典中的key进行hash计算得到一个hash值,然后和7进行与的位运算后,得到一个值,比如是0,就把dict中的键值对放到0的这个内存位置
3)不同的key进行hash计算后,可能会得到一个相同的hash值,从而造成冲突;为解决这个问题,可按照一种机制重新进行hash计算。
4)声明数组的时候,分配的内存空间会比实际的dict数据量大
5)只须根据dict的key找到数组中的前面的偏移量,即可得到相应的键值对,复杂度为O(1)
3. 哈希表查找原理图
说明:
1)表元就是哈希图中最右侧存储键值对的地方
2)散列冲突就是hash冲突
3)造成散列冲突时,会多取几位散列值来定位表元。
4. dict原理小结
1)dict的key或者set的值都必须是可hash的,他们的实现原理相同。不可变对象都是可hash的,比如string, tuple, fronzenset
2)dict的内存花销大,但是查询速度快;自定义的类中,只要加上魔法函数__hash__, 那么这个类就是可hash的
3)dict的存储顺序和元素添加顺序有关,因hash值冲突的原因
4)添加数据的时候有可能会改变已有数据的顺序:存储dict的时候,python会预先申请一段大于dict数据需求的连续内存空间,以减少hash冲突的概率,当添加数据量使得大于分配内存空间的1/3的时候,python就会另申请一个较大的内存空间,把原先的数据进行迁移,重新进行hash值的计算
- tuple放入dict中
tuple放入dict中是否可以正常运行 # 将tuple放入dict中 a = ('AI','Kobe','Yao') b = ('AI',['Kobe','Yao']) dict1 = {'a': ...
- redis数据结构存储Dict设计细节(redis的设计与实现笔记)
说到redis的Dict(字典),虽说算法上跟市面上一般的Dict实现没有什么区别,但是redis的Dict有2个特殊的地方那就是它的rehash(重新散列)和它的字典节点单向链表. 以下是dict用 ...
- python list dict 去重的两种方式
def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item ...
- list,tuple,dict,set常用方法
Python中list,tuple,dict,set常用方法 collections模块提供的其它有用扩展类型 from collections import Counter from collect ...
- python dict clear只能删除一层,不能够递归删除。
void PyDict_Clear(PyObject *op) { dictobject *mp; dictentry *ep, *table; int table_is_malloced; Py_s ...
- Python中内置数据类型list,tuple,dict,set的区别和用法
Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...
- python第一天 - dict
dict key-value集合. d = { ': 'a', ': 'b', ': 'c' } (一).获取集合长度:len(d) = 3(二).获取值: 方式一:d[key];例:d['1'] = ...
- python利用dict模拟switch
pytho本身并未提供switch语句,但可以通过dict来模拟switch, #方法1 def add(x,y): return x+y def dec(x,y): return x-y def m ...
- python-list tuple dict set
1:删除一个列表末尾的元素 pop方法 >>> a [1, 'Jack', 2, 3, 2] >>> a.pop() >>> a [1, 'Jac ...
- python基础之dict、set及字符
python基础之dict.set及字符串处理 本节内容 字典介绍及内置方法 集合介绍 字符串处理 1.字典介绍及内置方法 字典是python中唯一的映射类型,采用键值对(key-value)的形式存 ...
随机推荐
- python list和函数之间的复制和原地址修改问题
def change(a): a.pop() #自带的方法都是原地址修改 a=[,,] change(a) print (a)#直接修改了3. def change(a): a=[,,,] #复制操作 ...
- ubuntu 'yuan' update
# tsinghua university deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiv ...
- window.load 和$(document).ready() 、window.load和body onload区别
1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕.2.编写个数不同 w ...
- c++中如何定义编译期间常量,即这个常量可以用于定义数组下标
在c++中,类里面的成员变量不仅仅可以被const修饰,还可以被static const修饰,此时一个内建类型(如int ,char ,long等)的static const 可以看做是一个编译期间的 ...
- MVC--SSM和SSH简介
- 2018.09.16 codeforces1041C. Coffee Break(双端队列)
传送门 真心sb题啊. 考场上最开始看成了一道写过的原题... 仔细想了一会发现看错了. 其实就是一个sb队列. 每次插入到队首去就行了. 代码: #include<bits/stdc++.h& ...
- ILA用法
Ila在使用过程中Capture mode可选, write_hw_ila_data 把从ILA中读出的数据写入文件中. Syntax write_hw_ila_data [-force] [-csv ...
- Memcached 应用场景
1. 把java对象序列化成base64 存入缓存,不同平台可以反序列化. 2. 通过key去重复 3. 保存一些信息,供所有平台使用
- 201709019工作日记--Java中的各种锁--未解决
1. Syncronized与ReentrantLock Synchronized比ReentrantLock进java标准早,因此一开始大家都是用它.相当于Java提供了一种封装的互斥锁机制,对于用 ...
- post异步请求
//创建url NSURL *url = [[NSURL alloc] initWithString:@"http://api.hudong.com/iphonexml.do"]; ...