2020-09-28-元祖和字典

day6-元祖和字典

元祖
  1. 什么是元祖(tuple)

    元祖是不可变的列表

    元祖是容器型数据类型,将()作为容器标志,里面多个元素用逗号隔开:(元素1,元素2...)

    元祖不可变(不支持元素的增删改);元祖是有序的(支持下标的操作)

    元素:任何数据类型,并且可以重复

    t1 = (1,3,'abc',85)
    print(type(t1), t1)  # <class 'tuple'>  (1,3,'abc',85)
    
  2. 只有一个元素的元祖

    如果元祖中有且只有一个元素,那么唯一的元素的后面必须加逗号

    t2 = (12,)
    print(type(t2)) # <class 'tuple'>
    
  3. 省略括号

    在没有歧义的情况下,可以省略元祖的(),直接将多个元素用逗号隔开来表示一个元祖

    t5 = 'abc',42,58,True
    print(t5,type(t5))  #  # ('abc', 42, 58, True) <class 'tuple'>
    
  4. 获取元素

    1)列表获取元素的方法元祖都支持

    song = ('葫芦娃', '稻香', '夜曲', '下山')
    print(song[1])
    print(song[1:])
    
    for x in song:
        print(x)
        
    for index,x in enumerate(song):
        print(index,x)
        
    for index in range(len(song)):
        print(song[index])
    

    2)让变量的个数和元祖中元素的个数保持一致 来获取元祖所有元素的值

    变量1,变量2,变量3... = 元祖

    num1,num2,num3 = (12,25,6)
    x,y,z = 2,25,6
    

    3)同时用多个变量获取元祖中的元素的时候,变量的个数可以比元祖中的个数少,但是有且只有一个变量的前面加*

    *m,n = 25,12,6
    print(*m,n)  # 25,12,6
    
    stu = ('小明','男',20,52,170)
    m1,*m2,m3 = stu
    print(m1,*m2,m3)  # 小明 ['男', 20, 52, 58, 6] 8
    
  5. 元祖的相关操作

    列表相关操作元祖都支持

    print((1,2,3) + (4,5)) # (1,2,3,4,5)
    print((1,2,3)*2)  # # (1, 2, 3, 1, 2, 3)
    print((1,2,3) > (44,2))  # False
    print((1,2,3) == (1,3,2))  # False     (元祖是有序的)
    

    in 和 not in

    print(10 in (10,20,30))  # True
    print(10 not in (10,20,30))  # False
    

    sum,max,min, sorted,len,tuple

    t1 = (1,2,3)
    print(sum(t1))
    print(max(t1))
    print(min(t1))
    
    new_t1 = sorted(t1)  # 排序(升序) 产生一个新的列表
    print(new_t1)  # [1, 2, 3]
    
    print(len(t1))  # 3
    
    print(tuple('abc'))  # ('a', 'b', 'c')
    print(tuple(range(5)))  # (0, 1, 2, 3, 4)
    
字典
  1. 什么时候使用字典:同时保存多个意义不同的数据就使用字典

  2. 什么是字典

    字典是容器型数据类型,将{}作为容器,里面多个元素用逗号隔开(元素必须键值对:{键1:值1,...})

    字典是可变的(支持增删改查),字典是无序的(不支持下标操作)

    元素: 必须是键值对:

    ​ 键: -- 必须是不可变的数据(数字,字符串,元祖)一般使用字符串,键是用来对值进行描述和区分的,是唯一的

    ​ 值: -- 没有要求

    1)键是不可变的

    d2 = {'name':'小明',10:200,(1,2):200}
    print(d2) # {'name': '小明', 10: 100, (1, 2): 200}
    
    # 报错! 列表不能作为键
    d2 = {'name':'小明',10:200,[1,2]:200}
    print(d2) # # TypeError: unhashable type: 'list'
    

    2)键是唯一的

    d3 = {'name':'小明','age':'18','name':'张三'}
    print(d3) # {'name': '张三', 'age': '18'}
    

    3)字典是无序

    print({'a':10,'b':20} == {'b':20,'a':10})  # True
    
  3. 字典的增删改查

    1.1)获取单个值

    a.字典[key] - 获取指定key对应的值(如果key不存在会报错

    b.字典.get(key) - 获取指定key对应的值(如果key不存在会报错)

    dog = {'name':'财财','age':2,'sex':'母狗'}
    print(dog['name'])  # 财财
    print(dog.get('age'))  # 2
    
    print(dog.get('weight'))  # None
    print(dog.get('weight',0))  # 0
    

    1.2)遍历

    for 变量 in 字典:

    ​ pass

    注意:变量依次取到的是字典的key

    dog = {'name':'财财','age':2,'sex':'母狗'}
    for x in dog:
        print('x:',x,dog[x])
    
    # x: name 财财
    # x: age 2
    # x: sex 母狗
    

    2) 增、改

    字典[key] = 值 -- 当key存在就是修改指定的值,当key不存在就是添加键值对

    dog = {'name':'财财','age':2,'sex':'母狗'}
    dog['name'] = '花花'
    dog['weight'] = 20
    print(dog)   # {'name': '花花', 'age': 2, 'sex': '母狗', 'weight': 20}
    

    3)删

    del 字典[key] - 删除指定key对应的键值对

    字典.pop(key) - 取出指定key对应的值

    dog = {'name':'财财','age':2,'sex':'母狗'}
    del dog['name']
    print(dog)  # {'age': 2, 'sex': '母狗'}
    
    del_age = dog.pop('age')
    print(dog,del_age)  # {'sex': '母狗'} 2
    

字典的实际应用

练习:定义一个变量保存一个班级的信息,班级信息主要包含:班级名称、位置、容量、班主任、讲师、所有学生
班主任:姓名、性别、年龄、电话、QQ
讲师:姓名、性别、年龄、电话、QQ、级别
所有学生:多个学生,每个学生包含:姓名、性别、年龄、学历、专业、电话
class1 = {
    'name':'python2004',
    'location':'9教室',
    'capacity':'50',
    'class_teacher':{
        'name':'张老师',
        'gender':'女',
        'age':'30',
        'tel':'110',
    },
    'teacher':{
        'name','骆昊',
        'gender','男',
        'age','25',
        'tel','1558945',
        'rank','特级讲师',
    },
    'students':[
        {'name': '小明', 'gender': '男', 'age': 19},
        {'name': '小花', 'gender': '女', 'age': 18},
        {'name': '张三', 'gender': '男', 'age': 23},
        {'name': 'Tom', 'gender': '男', 'age': 22},
        {'name': 'Bob', 'gender': '男', 'age': 30}
    ],
}


print(class1['teacher']['name'],class1['teacher']['rank'])

# 计算班级所有学生平均年龄

sum1 = 0
ages = class1['studens']
for x in ages:
    sum1 += x['age']
print(sum1/len(ages))  #  22.4    

字典的相关操作

字典不支持加法乘法运算,也不支持比较大小

1)in 和 not in

key in 字典 - 判断字典中是否存在指定的键

d1 = {'a':10,'b':20}
print(10 in d1)  # False
print('a'  in  d1)  # True

2)相关函数:len dict

print(len(d1)) # 2

"""
字典的类型转换
dict(数据)  - 将指定数据转换成字典,数据要求
            a.数据本身是序列
            b.序列中的每个元素必须是长度为2的小序列
            c.小序列中的第一个元素是不可变的数据
            
list(数据)  - 将指定的字典转换成列表(将字典的key作为列表的元素)
"""

print(dict(['ab',[1,2]])) # {'a':'b',1:2}

# list(字典)
d1 = {'a':10,'b':20,'c':30}
print(list(d1))  # ['a', 'b', 'c']

3)相关方法

​ 1)字典.clear() - 清空字典

​ 2)字典.copy() - 复制字典产生一个一模一样的新字典并返回

​ 3)dict.fromkeys(序列) - 创建一个新的字典,键是序列中的每个元素,值都是None

​ 4)keys values items

"""
字典.keys() - 获取字典所有的key(返回值是序列但是不是列表)
字典.values() - 获取字典所有的值(返回值是序列但是不是列表
字典.items() - 同时获取每个键值对的键和值(返回值是序列,序列中元素是元祖)
"""

d1 = {'a':10,'b':20,'c':30}
print(d1.keys())  # dict_keys(['a', 'b', 'c'])
print(d1.values()) # dict_values([10, 20, 30])
print(d1.items()) # dict_items([('a', 10), ('b', 20), ('c', 30)])

​ 5)字典.setdefault(键,值) - 在字典中添加键值对(只添加不修改)

d1 = {'a':10,'b':20,'c':30}
d1.setdefault('name','小明')
print(d1)  # # {'a': 10, 'b': 20, 'c': 30, 'name': '小明'}

​ 6)字典1.update(字典2) - 将字典2中所有的键值对都添加到字典1中:注意:字典2不一定是字典,也可以是能转换成字典的序列

d1 = {'a':10,'b':20,'c':30}
d1.update({'name':'张三'})
print(d1)  # #   {'a': 10, 'b': 20, 'c': 30, 'name': '张三'}

1.声明一个字典保存一个学生的信息,学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明)

stu = {
    'name':'小明',
    'age':18,
    'score':90,
    'tel':1589546,
    'sex':'男'
}

2.声明一个列表,在列表中保存6个学生的信息(6个题1中的字典)
a.统计不及格学生的个数
b.打印不及格学生的名字和对应的成绩
c.统计未成年学生的个数
d.打印手机尾号是8的学生的名字
e.打印最高分和对应的学生的名字
f.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)

​ g.删除性别不明的所有学生

list1 = [
{ 'name':'小明','age':18, 'score':70,'tel':1589546,'sex':'不明'},
{ 'name':'张三','age':15, 'score':90,'tel':1589548,'sex':'男'},
{ 'name':'李四','age':20, 'score':45,'tel':1589546,'sex':'不明'},
{ 'name':'王五','age':16, 'score':56,'tel':1589548,'sex':'男'},
{ 'name':'小王','age':23, 'score':52,'tel':1589542,'sex':'女'},
{ 'name':'小李','age':25, 'score':60,'tel':1589544,'sex':'女'}
]
#   a.统计不及格学生的个数
#   b.打印不及格学生的名字和对应的成绩
count = 0
not_adult = 0
for x in list1:
    if x['score'] < 60:
        print(x['name'],x['score'])
        count += 1
    if x['age'] < 18:
        not_adult += 1
print('不及格的学生有:{}个,为成年的学生有:{}个'.format(count,not_adult))  # 不及格的学生有3个

# 李四 45
# 王五 56
# 小王 52
# 不及格的学生有3个

#   d.打印手机尾号是8的学生的名字
for i in list1:
    if i['tel'] % 10 == 8:
        print(i['name'])
        
print('============================')

#   e.打印最高分和对应的学生的名字
max_score = 0
for i in list1:
    if i['score'] > max_score:
        max_score = i['score']
print(max_score)
for x in list1:
    if x['score'] == max_score:
        print(x['name'])
        
print('+++++++++++++')
for x in list1:
    for i in list1:
        if i['score'] > max_score:
            max_score = i['score']
    if x['score'] == max_score:
        # print(x['name'])
        max_score_name = x['name']

print(max_score,max_score_name)
print('-------------------')

# ​ g.删除性别不明的所有学生
for index,x in enumerate(list1):
    if x['sex'] == '不明':
        list1.remove(list1[index])
print(list1)

#   f.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)

3.用三个列表表示三门学科的选课学生姓名(一个学生可以同时选多门课)
a. 求选课学生总共有多少人
b. 求只选了第一个学科的人的数量和对应的名字
c. 求只选了一门学科的学生的数量和对应的名字
d. 求只选了两门学科的学生的数量和对应的名字
e. 求选了三门学生的学生的数量和对应的名字

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352