赞
踩
dict
)字典(dict
,全称: dictionary
)是python
内置的一种使用“键值对结构”存储数据的存储模型。在其它语言中也称为map
或者是object
(对象)
创建/查询/修改字典
# 创建字典:变量名 = {键1:值1,键2:值2,……}
d = {'kendny': 99, 'Mary': 88}
# 添加数据:变量名[键] = 值 (字典中没有对应的键)
d['Tom'] = 87
# 获取数据: 变量名[键]
d['kendny'] # 或 d.kendny
# 修改数据:变量名[键] = 值 (字典中存在对应的键)
d['kendny'] = 100
# 通过键名取字典的值, 如果键名不存在, 就会报错; 通常可以通过 in或者get()方法判断键是否存在
if 'Thomas' in d:
value = d['Thomas']
# 或者
value = d.get('Thomas'); # 不存在value什么值都没有
常见操作字典的函数
函数 | 说明 | 实例 |
---|---|---|
len(d) | 获取字典d中元素的长度 | len(d) |
d.setdefault(key, value) | 向字典中添加新的键值对, 如果存在对应的键, 则忽略该操作; 返回添加成功键值对的值。 | `d.setdefault(‘f’, 33)`` |
d1.update(d2) | 使用新字典中的数据对原始字典数据进行更新 | dict1 = {"name":"itcast","age":11} dict2 = {"address":"北京","age":22} dict1.update(dict2) |
d.pop(key) | 从字典中删除指定键key对应的键值对, 如果键key 不存在将报错; 返回值:被删除的值value | d.pop(‘Mary’) |
popitem() | 从字典中删除字典最后一个键值对; 返回值: 被删除的键值对, 以元组的形式返回 | d.popitem() |
d.get(key) | 从字典中获取键为key 的值, 如果key 不存在, 则什么都不返回,也不报错 | d.get(key) |
d.keys() | 以列表的形式返回字典中所有的键名 | d.keys() |
d.values() | 以列表的形式返回字典中所有的键值 | d.value() |
d.items() | 将字典中的每一项键值对转化成元组, 并以列表的方式返回 | d.items() |
d.clear() | 清除字典中的元素 | d.clear() |
key
操作字典中存储的数据值value
dict
)内部存放的顺序和键key放入的顺序是没有关系的。
key
)进行数据的添加、删除、修改、查询等操作key
)计算位置的算法称为哈希算法(Hash)hash
的正确性, 作为key的对象就不能变。 在Python
中, 字符串、整数等不可变类型的数据可作为 字典的键*为什么字典dict
*查找速度这么快?
因为dict
的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。
第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。
总结: 字典的查找方式就是第二种, 字典在内部可以直接通过键
key
直接计算出对应的存放值的内存地址, 直接取出来, 所以速度非常快。
集合(set)是python
内置的一种存储无序不重复数据的数据存储模型
创建集合
s = {1, 2, 3} # 创建集合
集合是无序不重复数据的数据存储模型,它没有索引的概念,集合中的数据可以进行添加、删除等操作;
常见集合的函数
函数 | 说明 | 实例 |
---|---|---|
len(s) | 获取集合中元素的个数 | len(s) |
s.add(data) | 向集合s中添加数据data | s.add(4) |
s.remove(data) | 从集合中删除指定的数据, 如果数据不存在将报错 | s.remove(2) |
s.discard(data) | 删除集合中的data元素, 若data不存在,什么都不做 | s.remove(22) |
s.pop() | 从集合中删除字典的第一个元素并返回(不需要参数) | s.pop() |
s.clear() | 清空集合中的数据 | s.clear() |
s.copy() | 复制集合 | ns=s.copy() |
s1.difference(s2) | 计算2个集合的差集(在s1中, 但不在s2中) | |
s1.union(s2) | 计算2个集合的并集`` | |
s1.intersection(s2) | 计算2个集合的交集 |
集合中的其它操作
s = {1, 2, 3} >>> 2 in s #True 集合的成员检测 >>> {'*' + i '*' for i in s} # 集合推导式 >>> {i for i in s if i>1} # 带有条件的集合推导式 # 多循环集合推导式 >>>colors = {'red','blue','pink'} >>>sizes = {36,37,38,39} >>>result = {c + str(s) for c in colors for s in sizes} print(result) #difference() 计算2个集合的差集 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} result = dreamers.difference(girls)# result = a + b print(result) #difference_update() 计算2个集合的差集(差集更新操作) dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} dreamers.difference_update(girls)#a = a + b a += b print(dreamers) #union() 并集操作 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} result = dreamers.union(girls) print(result) #update() 并集更新操作 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} dreamers.update(girls) print(dreamers) #intersection() 计算2个集合的交集 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} result = dreamers.intersection(girls) print(result) #intersection_update 交集更新操作 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} dreamers.intersection_update(girls) print(dreamers) #超集和子集 boys = {'zzy','yqw','dw','wzc','lyb','wym','chy'} zoudu = {'wzc','lyb','wym'} girls = {'lsy','mmf','syj'} #issuperset() 检测当前集合是否是另一个集合的超集 result = boys.issuperset(zoudu) print(result) #issubset() 检测当前集合是否是另一个集合的子集 result = zoudu.issubset(boys) print(result) #isdisjoint() 检测2个集合是否不存在交集 存在交集 False result = boys.isdisjoint(girls) print(result) #symmetric_difference() 对称差集 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} result = dreamers.symmetric_difference(girls) print(result) #symmetric_difference_update() 对称更新差集 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} dreamers.symmetric_difference_update(girls) print(dreamers) #冰冻集合 #冰冻集合是一种特殊的集合类型,也是集合(集合是列表的话,冰冻集合就是元组) #创建冰冻集合 #一般不会创建空的冰冻集合 var = frozenset() print(var,type(var)) #带有数据的冰冻集合 var = frozenset(('qs','szx','bjh','acs')) print(var,type(var)) #成员检测 result = 'szx' in var print(result) #遍历冰冻集合 for i in var: print(i) #集合推导式(无法得到冰冻集合,可以得到集合,列表,元组,字典类型) result = {i for i in var} print(result,type(result)) #函数 #冰冻集合可以使用集合的函数(不修改集合本身的函数都可以使用) var = frozenset(('qs','szx','bjh','acs')) #copy() result = var.copy() print(result) #集合操作 交集,并集,差集,对称差集等 不修改冰冻集合本身就能使用:冰冻集合的操作结果都是冰冻集合 var1 = frozenset(('qs','szx','bjh','acs')) var2 = {'szx','bjh','lc','wb'} #冰冻集合操作 result = var1.union(var2) print(result) #普通集合操作(冰冻集合是参考集合) result = var2.union(var1) print(result) # 集合支持一系列标准操作,包括并集、交集、差集和对称差集 a = t | s # t 和 s的并集 b = t & s # t 和 s的交集 c = t – s # 求差集(项在t中,但不在s中) d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)
列表list
和dict
在进行数据存储与查找方面,列表list
是用时间换取空间, 它存储数据占用的空间小,浪费内存很少。但是查找和插入的时间随着元素的增加而增加; 字典dict
是用空间换取时间, 它存储数据占用大量的空间, 内存浪费多。
字典set
和dict
集合和字典检索的原理是一样的, 唯一区别就是没有存储对应的value
值; 字典的键值和集合的元素不可以放入可变对象, 因为无法判断两个可变对象是否相等, 也就无法保证集合(字典键值)不会有重复的元素。
将列表/元组转化成集合
l = [1, 2, 3, 4]
s1 = set(l)
t = (1, 2, 3, 4)
s2 = set(t)
说明: 后面我将逐渐将我的blog转移到我的个人网站 http://www.kendny.cn, 欢迎关注并评论!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。