python基础之字典、集合
一、字典(dictionary)
作用:存多个值,key-value存取,取值速度快
定义:key必须是不可变类型,value可以是任意类型
字典是一个无序的,可以修改的,元素呈键值对的形式,以逗号分割的,以大括号包围的序列;
典是python基础数据类型当中唯一一个映射关系的数据类型;
说明:
字典和列表一样,也能够存储多个数据,字典中的值并没有特殊顺序。
列表中找某个元素时,是根据下标进行的,如果下标很多,查找数据不方便。
当索引不好用时,使用字典,字典中找某个元素时字典的每个元素由2部分组成,键:值。例如 'name':'班长' ,'name'为键,'班长'为值,字典由键值组成。
字典的特点:
因为字典是无序的,所以字典没有索引值;
因为字典没有索引值,所以字典以键取值,(字典的键相当于列表的索引);
因为字典以键取值,所以字典的键唯一且不可修改;所以字典天生去重;
因为字典的键不可修改,所以列表和字典等可变类型的数据不可以给字典做键。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
字典的取值 |
keys |
返回一个包含字典所有key的列表 |
values |
返回一个包含字典所有vaule的列表 |
|
get |
以键取值,如果指定键不存在,默认返回None,可以指定返回内容 |
|
update |
以字典格式更新指定键的内容,如果键不存在,创建键和值 |
|
items |
返回字典键值呈元组形式的格式 |
|
|
len |
测量字典,键值对的个数(整体) |
字典的删除 |
pop |
弹出,返回并删除指定键对应的值 |
popitem |
随机弹出一个键值元组,这里随机的原因是因为字典无序 |
|
clear |
清空字典 |
|
字典的判断 |
in |
判断指定的键是否在字典当中,即将被废除,之后我们python3用in |
字典的遍历 |
通过for ...in ... |
通过for ... in ...:的语法结构,我们可以遍历字符串、列表、元组、字典等数据结构。
|
1、定义
nfo = {"name":"ryz","age":18,"qq":1249773850} print(type(info)) --------------------------------------------------------------- <class 'dict'>
2、增加
info = {"name":"ryz","age":18,"qq":1249773850} info["doing"] = "python" print(info) -------------------------------------------------------------- {'name': 'ryz', 'age': 18, 'qq': 1249773850, 'doing': 'python'}
3、修改
info = {"name":"ryz","age":18,"qq":1249773850} info["age"] = 3 print(info) ------------------------------------------------------------- {'name': 'ryz', 'age': 3, 'qq': 1249773850}
4、删除
info = {"name":"ryz","age":18,"qq":1249773850,"from":"shanxi","gradute":"zhongbei"} info.pop("qq") #标准删除 print(info) del info["gradute"] #注意是[] print(info) info.popitem() #随机删除 print(info) ------------------------------------------------------------------- {'name': 'ryz', 'age': 18, 'from': 'shanxi', 'gradute': 'zhongbei'} {'name': 'ryz', 'age': 18, 'from': 'shanxi'} {'name': 'ryz', 'age': 18}
#setdefault设置默认值 info = { 'name':'ryz', 'age':18, 'qq':1249773850 } info.pop('name') info.setdefault('name','ryz') #不存在默认插入 print(info) ----------------------------------------------------- {'age': 18, 'qq': 1249773850, 'name': 'ryz'}
5、查找
info = {"name":"ryz","age":18,"qq":1249773850,"from":"shanxi","gradute":"zhongbei"} print("age" in info) #检查字典是否存在该key,存在返回True,不存在返回False print(info.get("qq")) #获取qq对应的value值 print(info["age"]) #获取qq对应的value值 # print(info["love"]) #如果一个键不存在,就报错,get不会报错,不存在只返回None print(info.get("love")) ------------------------------------------------------------- True 1249773850 18 None
6、多级字典嵌套及操作
dict1 = { "北京":{ "朝阳区":["望京","国贸"], "海淀区":["央视塔"], "昌平区":["宏福"], }, "山西":{ "太原":["尖草坪","小店"], "晋中":["乔家大院","平遥古城"], }, "河北":{ "保定":[] }, } print(dict1["北京"]["朝阳区"]) dict1["河北"]["保定"] = "狼牙山" print(dict1["河北"]["保定"]) dict1["山西"]["太原"][0] += ",中北大学" print(dict1["山西"]["太原"]) ------------------------------------------------------------- ['望京', '国贸'] 狼牙山 ['尖草坪,中北大学', '小店']
7、其它
info = {"name":"ryz","age":18,"qq":1249773850,"from":"shanxi","gradute":"zhongbei"} print(info.keys()) #得到字典的键 print(info.values()) #得到字典的值 print(info.get("name")) #以键取值,如果知道键不存在,默认返回None,可以指定返回内容 # print(info.clear()) #清空字典 print(len(info)) #测量字典长度 -------------------------------------------------------------- dict_keys(['name', 'age', 'qq', 'from', 'gradute']) dict_values(['ryz', 18, 1249773850, 'shanxi', 'zhongbei']) ryz 5
info = {"name":"ryz","age":18} info2 = {"qq":1249773850} info.update(info2) #字典updata()函数把字典info2的键值对更新到dict里 print(info) ------------------------------------------ {'name': 'ryz', 'age': 18, 'qq': 1249773850}
info = {"name":"ryz","age":18,} print(info.items()) #以元组形式返回dict键值对 ------------------------------------------------- dict_items([('name', 'ryz'), ('age', 18)])
print(dict.fromkeys([1,2,3]),"hello") print(dict.fromkeys([1,2,3],"hello")) #通过一个列表生成默认dict,尽量少用 ----------------------------------------------------- {1: None, 2: None, 3: None} hello {1: 'hello', 2: 'hello', 3: 'hello'}
8、循环dict
info = {"name":"ryz","age":18,"qq":1249773850,"from":"shanxi","gradute":"zhongbei"} for i in info.items(): print(i) for k,v in info.items(): #会先把dict转成list,数据量大时莫用 print(k,v) ------------------------------------------------- ('name', 'ryz') ('age', 18) ('qq', 1249773850) ('from', 'shanxi') ('gradute', 'zhongbei') name ryz age 18 qq 1249773850 from shanxi gradute zhongbei
二、集合(set)
定义集合:{ }内用逗号分割每个元素都必须是不可变类型,元素不能重复,无序
集合对象还支持交集(intersection),差集(difference)、并集和对称差集(sysmmetric_difference)
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系
#作用:关系运算,去重 python = {"test","gavin","woniu"} linux = {"boy","girl","test"} # &交集:同时报名两门课程的学生 print(python&linux) # |并集: 所有的学生 print(python|linux) #^ 对称差集:没有同时报名两门课程 print(python^linux) # - 差集:只报名python课程的学生,去掉共同的部分 print(python-linux) --------------------------------------------------------------- {'test'} {'girl', 'woniu', 'test', 'boy', 'gavin'} {'girl', 'gavin', 'boy', 'woniu'} {'gavin', 'woniu'}
# s = set([3,5,9,10]) #创建一个数值集合 s = {3,5,9,10} print(type(s)) t = set("Hello") #创建一个唯一字符的集合 print(type(t)) print(s|t) # t 和 s的并集 print(s&t) # t 和 s的交集 print(s-t) # 求差集(项在t中,但不在s中) print(s^t) # 对称差集(项在t或s中,但不会同时出现在二者中) print(s.union(t)) #s | t #返回一个新的 set 包含 s 和 t 中的每一个元素 print(s.intersection(t)) #s & t #返回一个新的 set 包含 s 和 t 中的公共元素 print(s.difference(t)) #s - t #返回一个新的 set 包含 s 中有但是 t 中没有的元素 print(s.symmetric_difference(t)) #s ^ t #返回一个新的 set 包含 s 和 t 中不重复的元素 #基本操作: t.add('x') # 添加一项 print(t) s.update([10,37,42]) # 在s中添加多项 print(s) #使用remove()可以删除一项: t.remove('H') print(t) print(len(s)) #set 的长度 print('x' in s) # #测试 x 是否是 s 的成员 print('x' not in s) #测试 x 是否不是 s 的成员 print(s.issubset(t)) #s <= t #测试是否 s 中的每一个元素都在 t 中 print(s.issuperset(t)) #s >= t #测试是否 t 中的每一个元素都在 s 中 print(s.copy()) #返回 set “s”的一个浅复制 ---------------------------------------------------------------- 1、<class 'set'> 2、<class 'set'> 3、{'o', 3, 5, 9, 10, 'H', 'l', 'e'} 4、set() 5、{9, 10, 3, 5} 6、{'o', 3, 5, 9, 10, 'H', 'l', 'e'} 7、{'o', 3, 5, 9, 10, 'H', 'l', 'e'} 8、set() 9、{9, 10, 3, 5} 10、{'o', 3, 5, 9, 10, 'H', 'l', 'e'} 11、{'o', 'x', 'H', 'l', 'e'} 12、{3, 37, 5, 9, 10, 42} 13、{'o', 'x', 'l', 'e'} 14、6 15、False 16、True 17、False 18、False 19、{3, 42, 37, 5, 9, 10}