zoukankan      html  css  js  c++  java
  • day8

    字典

    # # 字典
    # # dict
    # 用途
    
    dic =dict(name = 'alex',age = 18,sex = 'male')
    print(dic)
    """语法"""
    1
    # len() 返回长度 字典key的个数
    # print(len(dic))w
    2
    # 身份运算 in   not in   返回真假
    # print('name' in dic)
    3
    # 删除 .pop(key)
    print(dic.pop('name','bu'))
    string = '购物车处练习'
    # 简单购物车,要求如下:
    # 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用户重新输入  
    # msg_dic = {
    #     'apple': 10,
    #     'tesla': 100000,
    #     'mac': 3000,
    #     'lenovo': 30000,
    #     'chicken': 10,
    # }
    # tag = True
    # list = []
    # while tag :
    #     for item in msg_dic:
    #         print(item,msg_dic[item])
    #     good = input('商品')
    #     if good in msg_dic:
    #         print(good)
    #         while tag:
    #             number = input('数量')
    #             if number.isdigit():
    #                 print(int(number)*msg_dic[good])
    #                 break
    #         list.append((good,msg_dic[good],number))
    #         print(list)
    #         cmd = input('q 退出 其他继续')
    #         if cmd =='q':
    #             break
    print('练习结束')
    4
    # get() 从字典中取值 找不到key 返回none 可以修改没有key时的返回值
    print(dic.get('name'))
    dic =dict(name = 'alex',age = 18,sex = 'male')
    # li =[1]
    # n = li.pop(1)
    # print(n)
    print(dic.get('hobby',''))
    print(dic.pop('llk','bu'))
    # l1 = [1,2,3,4,5]
    # l1.pop(10,'no')
    """在字典中的.pop()函数也能修改找不到key值时的返回值 但是在列表中的.pop没有更改默认值的选项"""
    # ps : 这边的返回值再看一下  有点没弄清楚
    5
    '''重点'''
    # setdefault()
    # 设置(key,value1) 当 dict中对应的key 不存在时 添加(key,value1)  并返回 value1
    #                  当 dict 中存在对应的item(key,value0)时 不添加新的值 ,返回初始的值value0
    # 例子
    # 2 统计s='hello alex alex say hello sb sb'中每个单词的个数
    # 结果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2}
    s = 'hello alex alex say hello sb sb'
    li = s.split(' ')
    dic_1 = {}
    for i in li:
        """for i in [] i  是列表中的元素而不是索引  搞明白 错好几次了"""
        dic_1.setdefault(i,li.count(i))
    print(dic_1)
    # ps 因为setdefault 存在返回值 所以可以直接操作
    """setdefault() 传入两个参数 一个是key一个是value_1 记住了当key存在时 函数返回之前的(value_0) 
         并且 现在字典中对应的关系是 key : value_0"""
    """如果 setdefault 对应的value 是可变数据类型 可以在外面更改 字典中对应的value会相应地改变
        但是如果 setdefault 对应的value 是不可变数据类型那么只能重新赋值才能更改"""
    6
    # update()  更新
    dic_1 = {'name':'lee'}
    dic_2 = {"age" :18,'sex':'male'}
    dic_1.update(dic_2)
    print(dic_1)
    """还可以传入一个变量 ????"""
    7
    # 循环 (默认循环的值是字典中的keys 可以自己定义)
    # for
    # while
    print(dic.keys())
    print(dic.values())
    print(dic.items())
    
    8
    # copy
    dic_1 = dic.copy()
    print(dic,id(dic))
    print(dic_1,id(dic_1))
    9
    # clear
    dic_1.clear()
    print(dic_1)
    10
    # fromkeys
    dic =dict.fromkeys(['lee','zhl','ww'],'屌丝')
    # 一般用于建立新列表
    dic = dict.fromkeys([1,2,3,4,5,6,7,],"")
    """第一个参数传入可迭代类型"""
    print(dic)
    
    # 1 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
    # 即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
    # li = [11,22,33,44,55,66,77,88,99,90]
    # dic = {}
    # for i in li:
    #     if i >66:
    #         dic.setdefault('k1',[]).append(i)
    #     elif i<66:
    #         dic.setdefault('k2',[]).append(i)
    # print(dic)
    # """分清楚什么时候用setdefault """
    # """如果 setdefault 对应的value是不可变或者 我们知道setdefault的key的个数时 可以考虑不使用setfault"""
    # li = [11,22,33,44,55,66,77,88,99,90]
    # dic_2 = {'k1':[],'k2':[]}
    # for i in li:
    #     if i>66:
    #         dic_2['k1'].append(i)
    #     elif i<66:
    #         dic_2['k2'].append(i)
    # print(dic_2)
    #
    # """重点  不熟练 写五遍"""
    # 2 统计s='hello alex alex say hello sb sb'中每个单词的个数
    #
    # 结果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2}
    # s='hello alex alex say hello sb sb'
    # li = s.split(' ')
    # dic = {}
    # for i in li :
    #     key_num =dic.setdefault(i,0)
    #     dic[i] = key_num+1
    # print(dic)
    # # 第二遍
    # for i in li:
    #     dic_1.setdefault(i)
    #     print(dic_1)
    # print(dic)
    #
    # """重点  不熟练 写三遍"""
    # """ 当value是列表 时  setdefault用法
    #     当value是字符串是 setdefault的用法"""
    View Code

    集合

    # set 集合
    # 像列表一样可以存放多个数据:
    # 作用 : 常用来去重关系运算
    # 定义:在{}用,分割多个元素
    """
    每个元素必须是不可变类型
    集合内没有重复元素
    集合内元素无序
    """
    # 可迭代类型都可以被set()转化成集合. ps强调:每个元素必须是不可变类型
    # 集合去重的局限性
    """
    1 每个元素必须是不可变类型
    2 集合去重后不保留顺序"""
    
    set_1 = {1, 2, 3, 4}
    set_0 = {2, 3, 4, 5}
    # & 交集
    # | 并集
    # ^ 对称补集
    # - 差集
    # > >= < <= 父集子集
    print(set_1 & set_0)
    print(set_1 | set_0)
    print(set_0 ^ set_1)
    print(set_0 - set_1)
    print(set_1 >= set_0)
    # 一.关系运算
    #   有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
    #   pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    #   linuxs={'wupeiqi','oldboy','gangdan'}
    #   1. 求出即报名python又报名linux课程的学员名字集合
    #   2. 求出所有报名的学生名字集合
    #   3. 求出只报名python课程的学员名字
    #   4. 求出没有同时这两门课程的学员名字集合
    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    print(pythons &linuxs)
    print(pythons |linuxs)
    print(pythons-linuxs)
    print(pythons^linuxs)
    # 二.去重
    #
    #    1. 有列表l=['a','b',1,'a','a'],列表元素均为可hash类型,去重,得到新列表,且新列表无需保持列表原来的顺序
    l=['a','b',1,'a','a']
    # s=set(l)
    # l=list(s)
    # print(l)
    #    2.在上题的基础上,保存列表原来的顺序
    li =[]
    for i in l:
        if i not in li:
                li.append(i)
    print(li)
    #    3.去除文件中重复的行,肯定要保持文件内容的顺序不变
    #    4.有如下列表,列表元素为不可hash类型,去重,得到新列表,且新列表一定要保持列表原来的顺序
    
    l=[
        {'name':'egon','age':18,'sex':'male'},
        {'name':'alex','age':73,'sex':'male'},
        {'name':'egon','age':20,'sex':'female'},
        {'name':'egon','age':18,'sex':'male'},
        {'name':'egon','age':18,'sex':'male'},
    ]
    set.clear()
    set.copy()
    set.update()
    set.pop()
    set.remove()
    set.add()
    set.difference()
    set.difference_update()
    set.discard()
    View Code

    元组

    # 元祖
    # tuple
    # 元组与列表类似用于记录多个任意类型的值,但不同之处是元组相当于不允许更改的列表,用于记录多个固定不允许修改的值,单纯用于取
    """注意.容器类型的数据类型内存取的值都是内存地址,元组同样如此
    因此可能造成元组内存放的地址不变,但是内存地址中的值变了[只发生于存放可变类型时,不可变类型id不变值不变]
    但这是可变类型本身的性质与元组无关"""
    tup = (1,'abc','233')
    print(tup[0])
    #
    print(tup.count(1))
    # 查询
    print(tup.index(1,0,1))
    """可以设定起始位置和结束位置"""
    # 成员运算
    print(1 in tup)
    # 循环
    View Code

    可变不可变

    # 可变不可变数据类型
    """变量在内存中的存储方式"""
    #  堆区 : 存放 变量名与内存地址的对应关系
    #  栈区 :  在内存地址存放变量内容
    # 个人理解
    # 当我们能够在栈区的内存地址(我们暂时称为根本内存地址)中修改内容时.数据类型是可变数据类型,反之是不可变数据类型
    # 数字类型(int float)
    # 不能在其对应的根本内存地址中修改内容 只能更换内存地址 == 不可变数据类型
    # 字符串类型
    # 不能在其对应的根本内存地址中修改内容 只能更换内存地址 == 不可变数据类型
    # 列表类型
    # 可以在其对应的根本内存地址中修改内容  == 可变数据类型
    # 字典
    # 可以在其对应的根本内存地址中修改内容  == 可变数据类型
    # 集合(set)
    # 可以在其对应的根本内存地址中修改内容  == 可变数据类型
    # 元组(tuple)
    # 比较特殊  不可以在其对应的内存地址中修改内容,但是元组是容器类型的数据类型
    # 其内存地址中的内容存放的是一系列内存地址(我们暂时称为映射内存地址)映射内存地址中可以存放任意数据类型
    # 所以虽然元组是不可变数据类型,即根本内存地址中的值(映射内存地址)不可变 ,但是其映射地址对应的如果是可变数据类型(列表字典集合)
    # 那其映射地址中的值可以改变.print输出的值可以改变,但本质上元组没有改变.因此元组是不可变数据类型
    View Code

    作业

    # 作业(必做题):
    #
    #     使用while循环输出1 2 3 4 5 6 8 9 10
    #
    #     求1-100的所有数的和
    #
    #     输出 1-100 内的所有奇数
    #
    #     输出 1-100 内的所有偶数
    #
    #     求1-2+3-4+5 ... 99的所有数的和
    #
    #     用户登陆(三次机会重试)
    #
    # 7:猜年龄游戏 要求: 允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出
    #
    # 8:猜年龄游戏升级版(选做题) 要求: 允许用户最多尝试3次
    #
    # 每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序
    #
    # 如何猜对了,就直接退出
    # 1
    # count = 0
    # while count < 10:
    #     count += 1
    #     print(count)
    # 2
    # amout = 0
    # for i in range(1, 101):
    #     amout += i
    # print(amout)
    # 3
    # for i in range(1, 101):
    #     if i % 2 == 0:
    #         print(i)
    # 4
    # for i in range(1, 101):
    #     if i % 2 == 1:
    #         print(i)
    # 5
    # amout = 0
    # for i in range(1, 101):
    #     if i % 2 == 1:
    #         amout += i
    #     if i % 2 == 0:
    #         amout -= i
    # print(amout)
    # count = 0
    # while count<3:
    #     count +=1
    #     user_name = input('name')
    #     password = input('password')
    #     if user_name == 'lee' and password == '123456':
    #         print('login successful')
    #         break
    #     else:
    #         print("your username and password con't match")
    #
    # count = 0
    # while count<3:
    #     count +=1
    #     number = int(input('place guess my age '))
    #     if number == 18:
    #         print('good you are right')
    #         break
    #     else:
    #         print("False")
    # 8:猜年龄游戏升级版(选做题) 要求: 允许用户最多尝试3次
    # 每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序
    # 如何猜对了,就直接退出
    count = 0
    tag = True
    while tag:
        count +=1
        number = int(input('place guess my age '))
        if number == 18:
            print('good you are right')
            break
        else:
            print("False")
            print(count)
        while count == 3:
            cmd = input('''c 继续玩
            q 退出''')
            if cmd == 'q':
                tag = False
                break
            elif cmd == 'c':
                count = o
                break
            else:
                print('请输入正确的指令')
    View Code
    # 1 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
    #
    # 即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
    li = [11,22,33,44,55,66,77,88,99,90]
    dic = {}
    for i in li:
        if i >66:
            dic.setdefault('k1',[]).append(i)
        elif i<66:
            dic.setdefault('k2',[]).append(i)
    print(dic)
    
    li = [11,22,33,44,55,66,77,88,99,90]
    dic_2 = {'k1':[],'k2':[]}
    for i in li:
        if i>66:
            dic_2['k1'].append(i)
        elif i<66:
            dic_2['k2'].append(i)
    print(dic_2)
    # 2 统计s='hello alex alex say hello sb sb'中每个单词的个数
    #
    # 结果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2}
    li = s.split(' ')
    dic_1 = {}
    for i in li:
        dic_1.setdefault(i,li.count(i))
    print(dic_1)
    View Code
  • 相关阅读:
    2018.5.27 OraclePLSQL编程 if-else练习和循环结构练习
    桶排序
    从函数中返回引用
    函数返回值
    参数传递模式
    计数排序(不基于比较的排序算法)
    快排序
    堆用作优先队列
    堆排序
    合并算法
  • 原文地址:https://www.cnblogs.com/lee1225/p/12452836.html
Copyright © 2011-2022 走看看