python-set和dict
集合:
1、定义:集合(set)是一个无序的不重复的序列。
无序:存放的顺序和打印的顺序不一样。
底层原理:哈希表(无序、不重复)
可以保存一些不重复的元素
· 集合不支持下标和切片
2、集合的声明:
set1 = set() 空集合只能这样声明
set1 = set() print(type(set1)) # <class 'set'>
含有元素的集合:
set2 = {'大江','gang'}
3、set可以用于列表去重
list1 = ['hello','hello','gang','hello','hello'] print(list(set(list1))) # ['hello', 'gang']
4、集合的基本操作
添加:add(element) 单个元素的添加 update(iterable) 添加一组可迭代的对象
set1 = set() set1.add(3) print(set1) # {3} set1.update(['nihai'],[2,4],(2,3)) print(set1) # {2, 3, 4, 'nihai'}
删除:remove(element) 删除指定的元素 pop() 随机删除(每次都是第一个元素)
clear() 清空 del set集合 (清空元素并回收地址)
discard() 如果集合中没有此元素,不报错
set1 = {1,5,'hao',8,2,4,6,5} set2 = {1,23,'hao',45,2,1} set1.remove(5) print(set1) # {1, 2, 4, 6, 8, 'hao'} set2.pop() print(set2) # {2, 45, 'hao', 23} set2.discard(3) print(set2) # {2, 45, 'hao', 23}
不能修改和查询
排序:
''' 随机产生1-20的不重复的数字10个,保存到集合中 对以上的集合升序排列 找出最大值和最小值 ''' import random set1 = set() # for i in range(10): # set1.add(random.randint(1,20)) while True: a = random.randint(1,20) if (len(set1))<10: set1.add(a) else: break print(set1) print(sorted(set1,reverse=True)) print(max(set1)) print(min(set1))
补充:枚举
# enumerate() 枚举 set1 = {'gang','weiwei','xiaoqiang','shaojie'} for index,value in enumerate(set1): print('{}:{}'.format(index,value))
5、操作符: in is 交集 & , 并集 | , 差集 - ,对称差集 ^ (差集的并集)
& intersection()
| union()
- difference()
set1 = {1,5,'hao',8,2,4,6,5} set2 = {1,23,'hao',45,2,1,8} for i in set1: print(i,end='') # 124568hao print() print(set1 is set2) # False # 集合运算 : result = set1 & set2 print('交集:',result) # 交集: {8, 1, 2, 'hao'} result = set1.intersection(set2) print('方法实现交集:',result) # 方法实现交集: {8, 1, 2, 'hao'} # set1.intersection_update(set2) # print('update方法实现交集:',result) result = set1 | set2 print('并集:',result) result = set1.union(set2) print('方法实现并集:',result) # 并集: {1, 2, 4, 5, 6, 8, 45, 'hao', 23} # 方法实现并集: {1, 2, 4, 5, 6, 8, 45, 'hao', 23} result = set1 - set2 print('差集:',result) result = set2.difference(set1) print('方法实现差集:',result) #差集: {4, 5, 6} #方法实现差集: {45, 23} result = set1 ^ set2 print('对称差集:',result) result = set1.symmetric_difference(set2) print('方法实现对称差集:',result) # 对称差集: {4, 5, 23, 6, 45} # 方法实现对称差集: {4, 5, 23, 6, 45}
字典
1、定义:字典是一种可变容器模型,且可存储任意类型对象。
字典的每个键值对用(:)分割,每个对之间用(,)分割,整个字典包括早花括号({})中
2、字典特点:
dict--- 保存的时候都是以键值对的形式保存
1、字典以键值对保存
2、键必须是唯一的,但值则不必
3、字典没有下标,因为底层实现也是哈希表
3、字典的声明:
空字典:
dict1 = dict()
dict2 = {}
有内容的字典:
dict1 = {'gang':'123','杰':'456'}
dict1 = dict() print(type(dict1)) dict2 = {} print(type(dict2))
注意:注意结果
dict1 = {'zhangsan':20,'lisi':21,'lisi':22,'zhangsan':23} print(dict1) # {'zhangsan': 23, 'lisi': 22}
4、字典元素的获取
获取都是根据key得到value:
方式一: dict1[key] ---- value,如果key不存在的话则报错keyError
方式二: dict1.get(key[,default]) ---- 如果key不存在的话,没有设置默认值,则返回none
如果key不存在的话,设置了默认值default,则返回default的值
# 获取的都是根据key得到value dict1 = {'gang':12,'zhangsan':23,'lisi':45,'wangwu':67} print(dict1['gang']) print(dict1['lisi'])
5、字典的内置函数
1》get(key,default) 重点
# 内置方法:get() value = dict1.get('lisi') print(value) value = dict1.get('zhaoliu',18) print(value)
2》字典的增删改查:
增加和修改的格式是一样的:dict[key] =value 到底做的是添加还是修改,取决于字典中是否存在此key,如果存在则修改,不存在则添加
增加和修改:
# 增加 dict1 = {} dict1['zhangsan'] = 19 print(dict1) # 修改 dict1['zhangsan'] = 20 print(dict1)
3》删除:
pop('key') 根据key删除键值对,并将值返回
popitem() 随机删除,从后向前删除键值对的,返回值是(key,value)
clear() 清除
del dict['key'] ---- 根据key删除键值对,类似pop(key)
del dict1 清空内容并回收内存
# 删除 dict1 = {'gang':12,'zhangsan':23,'lisi':45,'wangwu':67} result = dict1.pop('wangwu') # 删除键值对并将值返回 print(result) print(dict1) dict1.popitem() print(dict1) result = dict1.popitem() print(result) print(dict1)
4》查找:keys() values() items()
dict1 = {'gang':12,'zhangsan':23,'lisi':45,'wangwu':67} ks = dict1.keys() print(list(ks)) # ['gang', 'zhangsan', 'lisi', 'wangwu'] vs = dict1.values() print(list(vs)) # [12, 23, 45, 67] its = dict1.items() print(list(its)) # [('gang', 12), ('zhangsan', 23), ('lisi', 45), ('wangwu', 67)] for key,value in dict1.items(): print(key,value)
构建一个新的字典通过iterable
result = dict.fromkeys(['a','b','c'],100)
6、字典的支持的符号:in is
dict1 = {'gang':12,'zhangsan':23,'lisi':45,'wangwu':67} for i in dict1: print(i) # 所有的key被打印出来 if 'gang' in dict1: print('能') else: print('不能')
7、转换 列表转字典:
list1 = [('a',100),('b',98),('c',99)] dict1 = dict(list1) print(dict1) # {'a': 100, 'b': 98, 'c': 99} list2 = list(dict1) print(list2) # ['a', 'b', 'c']
8、综合练习:图书管理系统
# __author:gang # date: 2019/7/31 ''' 图书管理系统 1、借书 2、还书 3、查询书籍 4、显示所有书籍 5、根据用户用户名查询书籍 6、退出系统 ''' import time print('*' * 50) print('--------欢迎进入山大图书系统--------') print('*' * 50) book_dict = {'天龙八部': 5, '水浒传': 5, '斗破苍穹': 4, 'python': 3} # 存放书籍的字典 user_book_dict = {} while True: choice = input('请选择功能:1、查询书籍 2、借书 3、还书 4、显示所有书籍 5、根据用户用户名查询书籍 6、退出系统:') if choice == '1': book_name = input('请输入书籍名:') # 判断输入的书籍是否在库中 if book_name in book_dict: print('{}这本书在书库中,还剩{}本...'.format(book_name, book_dict[book_name])) else: print('{}这本书不在书库中...') elif choice == '2': # 请输入用户名 username = input('请输入用户名:') book_name = input('请输入书籍:') # 判断书籍在不在书库中 if book_name in book_dict: print('{}这本书在书库中,还剩{}本...'.format(book_name, book_dict[book_name])) # 判断此书籍的数量 if book_dict[book_name] > 0: # 判断用户是否借过这本书 if username in user_book_dict: if book_name in user_book_dict[username]: print('您已经借过这本书了,不能再借了!!!') else: user_book_dict[username].add(book_name) print('{}借书成功...'.format(username)) book_dict[book_name] -= 1 else: # 此人没有在图书馆借过书 # 构建结构 ['',{'','',''}] sbooks = set() sbooks.add(book_name) user_book_dict[username] = sbooks print('{}借书成功...'.format(username)) book_dict[book_name] -= 1 else: print('这本书已经被借完了...') else: print('没有这本书籍...') elif choice == '3': print('-----还书------') username = input('请输入用户名:') book_name = input('请输入书籍名:') # 判断用户在不在列表中 if username in user_book_dict: # 判断这本书在不在列表中: if book_name in list(user_book_dict[username]): # 删掉这本书 user_book_dict[username].remove(book_name) book_dict[book_name] +=1 # 还书成功 print('成功归还{}'.format(book_name)) else: print('{}该用户没有借过这本书'.format(username)) else: print('没有这个用户') elif choice == '4': print('------所有书籍--------') for key, value in book_dict.items(): print(key, value) elif choice == '5': print('---------根据用户名查询书籍----------') username = input('请输入要查询的用户名:') # 判断用户在不在列表中 if username in user_book_dict: print('{}借过的书籍有:'.format(username)) for index,value in enumerate(user_book_dict[username]): print('{}:{}'.format(index+1,value)) else: print("{}该用户还没有借过书") elif choice == '6': tui_chu = input('是否退出系统?y/n:') if tui_chu.lower() == 'y': print('欢迎下次光临!!!88') time.sleep(1) break else: print('欢迎下次光临!!!') break
9、字典和list比较,dict的特点:
1》查找和插入的速度极快,不会随着key的增加而变慢
2》需要占用大量的内存,内存浪费多
list则相反:
1》查找和插入的时间随着元素的增加而增加
2》占用空间少,浪费内存很少。