zoukankan      html  css  js  c++  java
  • 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》占用空间少,浪费内存很少。

      

    一路独行,遇见最好的自己!!!
  • 相关阅读:
    二分图匹配初步
    动态规划初步
    一些排日程的经典方法
    petri网初步
    笔记:美国院士教你写论文
    Ubuntu18.04彻底删除MySQL数据库
    ubuntu18.04 安装 wps2019
    ubuntu18.04 阿里镜像源
    Ubuntu 18.04 使用标准Ubuntu 仓库进行自动化安装NVIDIA驱动
    linux maven环境变量配置
  • 原文地址:https://www.cnblogs.com/rungang/p/11269870.html
Copyright © 2011-2022 走看看