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》占用空间少,浪费内存很少。

  

posted @ 2019-07-30 19:37  刚--  阅读(299)  评论(0编辑  收藏  举报