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
原文地址:https://www.cnblogs.com/lee1225/p/12452836.html