Day007 - 元组与字典

列表相关函数

max、min

  • max(序列) - 求序列最大值

  • min(序列) - 求序列最小值

  • 例子

    nums = [34, 89, 78]
    print(max(nums), min(nums))  # 89 34
    

sum

  • sum(数字序列) - 求数字序列中元素的和

  • 例子

    nums = [34, 89, 78]
    print(sum(nums))  # 201
    

sort与sorted

  • **sorted(序列) ** - 不修改原序列中元素的顺序而是产生一个新的排序列表;

  • 列表.sort() - 直接对原数据进行排序,会修改原序列;

  • 例子

    # sorted
    nums = [34, 89, 78, 0, 8]
    new_nums = sorted(nums)
    print(nums)  # [34, 89, 78, 0, 8]
    print(new_nums)  # [0, 8, 34, 78, 89]
    # sort
    nums = [34, 89, 78, 0, 8]
    result = nums.sort()
    print(nums)  # [0, 8, 34, 78, 89]
    print(result)  # None
    

len

  • len(序列) - 获取序列中元素的个数;

list

  • list(序列) - 所有的序列都可以转换成列表,所有的序列元素转换成列表元素;

  • 例子

    print(list('abc'))  # ['a', 'b', 'c']
    print(list(range(4)))  # [0, 1, 2, 3]
    nums = [34, 89, 78, 0, 8]
    print(list(enumerate(nums)))  # [(0, 0), (1, 8), (2, 34), (3, 78), (4, 89)]
    

列表推导式

语法

  • 本质就是创建列表的表达式(简洁)

  • 结构一:[表达式 for 变量 in 序列]

  • 结构二:[表达式 for 变量 in 序列 if 条件语句]

  • 例子

    list1 = [10 for x in range(4)]
    print(list1)  # [10, 10, 10, 10]
    list2 = [x for x in range(4)]
    print(list2)  # [0, 1, 2, 3]
    list3 = [x * 2 + 1 for x in range(4)]
    print(list3)  # [1, 3, 5, 7]
    scores = [89, 67, 43, 56, 10, 90]
    list4 = [x % 10 for x in scores]
    print(list4)  # [9, 7, 3, 6, 0, 0]
    list5 = [x >= 60 for x in scores]
    print(list5)  # [True, True, False, False, False, True]
    list6 = [x for x in scores if x >= 60]
    print(list6)  # [89, 67, 90]
    list7 = [10 for x in range(4) if x % 2]
    print(list7)  # [10, 10]
    

拓展 - 三目运算符

  • 单目运算符:not
  • 双目运算符:两个数字参与运算的运算符
  • 三目运算符:if-else

C/Java语言的三目运算符

  • 如果条件语句成立,整个运算结果是表达式1的值,否则运算结果是表达式2的值

    条件语句?表达式1:表达式2 
    

Python的三目运算符

表达式1 if 条件语句 else 表达式2
  • 例子

    age = 17a = '成年' if age >= 18 else '未成年'print(a)
    

应用

  • 让序列中的元素进行统一变换

    • [表达式 for 变量 in 序列]
      
  • 将序列中的元素满足某个条件元素进行变换(根据某个条件是否满足做两种不同的变换[三目运算])

    • [表达式1 if 条件语句 else 表达式2 for 变量 in 序列]
      
  • 提取或者删除序列中满足某个条件元素

    • [表达式 for 变量 in 序列 if 条件语句]
      
  • 例子

    nums = [89, 67, 34, 56, 10, 90]
    nums1 = [[index, item] for index, item in enumerate(nums)]
    print(nums1)  # [[0, 89], [1, 67], [2, 34], [3, 56], [4, 10], [5, 90]]
    
    # 练习1:将nums中所有的偶数除以2
    # [89, 67, 34, 56, 10, 90, 35] -> [89, 67, 17, 28, 5, 45, 35]
    nums = [89, 67, 34, 56, 10, 90, 35]
    nums1 = [item // 2 if not item % 2 else item for item in nums]
    print(nums1)  # [89, 67, 17, 28, 5, 45, 35]
    
    # 练习2:删除所有的偶数(提取所有的奇数)
    nums = [89, 67, 34, 56, 10, 90, 35]
    nums1 = [item for item in nums if item % 2]
    print(nums1)  # [89, 67, 35]
    

元组

  • 元组是容器型数据类型;
  • 将()作为容器的标志,里面多个元素用逗号隔开;
  • 表示方式:(元素1,元素2,元素3,…,元素N)
  • 元组不可变(只能查询);空元组存在,但是不可用;
  • 元组是有序的,支持下标操作;
  • 元素:什么样的数据都可以作为元组的元素

空元组

t1 = ()
print(type(t1), len(t1))

只有一个元素的元组

  • 唯一的元素后面必须加逗号
list1 = [12]
print(list1, type(list1), len(list1))  # [12] <class 'list'> 1
t2 = (12)  # 不加逗号括号表示将元素括起来,而不是表示为元组
print(t2, type(t2))  # 12 <class 'int'>
t3 = (12,)
print(t3, type(t3))  # (12,) <class 'tuple'>

普通情况

t4 = (10, 'df', True)
print(t4)  # (10, 'df', True)
  • 在没有歧义的情况下,元组的小括号可以省略(直接将多个数据用逗号隔开表示的也是一个元组);

    t5 = 10, 34, 78
    print(t5, type(t5))  # (10, 34, 78) <class 'tuple'>
    
    t6 = 10, 34, 78 * 2
    print(t6, type(t6))  # (10, 34, 156) <class 'tuple'>
    

元组的查询

  • 获取元组元素

列表获取元素的方式

  • 列表获取元素的方式元组都支持;

通过变量直接获取元组的元素

命名元组

  • 变量个数和元组中元素的个数保持一致

    point = (10, 23, 12)
    x, y, z = point
    print(x, y, z)  # 10 23 12
    

可变参数

  • 变量的个数小于元素的个数时,那么必须在其中一个变量前加星号

  • 取得时候先让没有变量按照位置关系获取元素,剩下的全部给带变量(以列表的形式);

    info = ('张三', 18, 175, 180, 90, 67, 89)
    name, age, *other = info
    print(name, age, other)  # 张三 18 [175, 180, 90, 67, 89]
    
    name, *other = info
    print(name, other)  # 张三 [18, 175, 180, 90, 67, 89]
    
    name, age, *other, math = info
    print(name, age, other, math)  # 张三 18 [175, 180, 90, 67] 89
    

元组不可变

  • 列表中不可变相关操作元组都支持

字典

作用

  • 同时保存多个意义不同的数据;

    stu = {
        'name': '小明', 'age': 20, 'gender': '男', '体重': 60, '数学': 89, '语文': 70,
        '英语': 55
    }
    print(stu['name'])
    

定义

  • 字典是容器型数据类型;
  • 将{}作为容器标志,里面有多个键值对用逗号隔开:{key1:value1,key2:value2,…,keyN:valueN,}
  • 字典是可变的(支持增删改);
  • 字典是无序的(不支持下标访问);
  • 元素的要求:字典元素是键值对;
    • 键 - 必须是不可变的唯一的数据(数字,字符串,元组);
    • 值 - 没有要求;

空字典{}

d1 = {}
print(type(d1), len(d1), bool(d1))  # <class 'dict'> 0 False

键是不可变数据

d2 = {1: 10, 'a': 20, (10, 20): 30}  # {1: 10, 'a': 20, (10, 20): 30}
print(d2)
# d3 = {1: 10, 'a': 20, [10, 20]: 30}  # TypeError: unhashable type: 'list'

键是唯一的

d4 = {1: 10, 'a': 20, (10, 20): 30, 'a': 30}  # 如果有重复键那么只会保存一个键的值
print(d4)  # {1: 10, 'a': 30, (10, 20): 30}

字典是无序的

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

字典的增删改查

字典的查询

  • 获取字典的值

获取单个值

  • 字典[键] - 获取字典中指定键对应的值,如果键不存在程序报错

  • 字典.get(键)| 字典.get(键,默认值) - 获取字典中指定键对应的值,如果键不存在返回None或者返回默认值

    dog = {'name': '黑猪', 'age': 3, 'breed': '土狗', 'gender': '母狗', 'color': '黑色'}
    print(dog['name'], dog['gender'])  # 黑猪 母狗
    print(dog.get('name'))  # 黑猪
    print(dog.get('height', 0))  # 0
    

字典的遍历

  • 通过for循环遍历字典的时候,循环变量依次取值为字典的键;

  • for 键 in 字典:
        循环
    
  • 例子

    dog = {'name': '黑猪', 'age': 3, 'breed': '土狗', 'gender': '母狗', 'color': '黑色'}
    for key in dog:
        print(key, dog[key])
    for k, v in dog.items():
        print(k, v)
    for i in dog.values():
        print(i)
    

实际应用中的字典和列表

定义一个保存一个班级信息

class1 = {
    'name': 'python2104',
    'address': '23教',
    'lecturer': {'name': '余婷', 'age': 18, 'QQ': '726550822'},
    'leader': {'name': '舒玲', 'age': 18, 'QQ': '2343844', 'tel': '110'},
    'students': [
        {'name': 'stu1', 'school': '清华大学', 'tel': '1123', 'linkman': {'name': '张三', 'tel': '923'}},
        {'name': 'stu2', 'school': '攀枝花学院', 'tel': '8999', 'linkman': {'name': '李四', 'tel': '902'}},
        {'name': 'stu3', 'school': '成都理工大学', 'tel': '678', 'linkman': {'name': '小明', 'tel': '1123'}},
        {'name': 'stu4', 'school': '四川大学', 'tel': '9900', 'linkman': {'name': '小花', 'tel': '782'}},
        {'name': 'stu5', 'school': '西南交大', 'tel': '665', 'linkman': {'name': '老王', 'tel': '009'}}
    ]}
  1. 获取班级名称

    class_name = class1['name']
    print(class_name)
    
  2. 获取讲师QQ

    lecturer_QQ = class1['lecturer']['QQ']
    print(lecturer_QQ)
    
  3. 获取所有学生的名字和学校

    for stu in class1['students']:
        print(stu['name'], stu['school'])
    
  4. 获取所有学生的联系人的电话

    for stu in class1['students']:
        print(stu['linkman']['tel'])
    

课后作业

1.创建一个列表,列表中有10个数字, 保证列表中元素的顺序,对列表进行排重,并对列表使用进行降序排序

例如:随机生成了[70, 88, 91, 70, 107, 234, 91, 177, 282, 197]
		--- 去重之后 [70, 88, 91, 107, 234, 177, 282, 197]
  	---- 降序排序 [282, 234, 197, 177, 107, 91, 88, 70]
nums = [70, 88, 91, 70, 107, 234, 91, 177, 282, 197]
new_nums = []
for index1 in nums:
    if not new_nums.count(index1) :
        new_nums.append(index1)
new_nums.sort(reverse=True)
print(new_nums)
# [282, 234, 197, 177, 107, 91, 88, 70]

2.利用列表推导式, 完成以下需求

a. 生成一个存放1-100中各位数为3的数据列表

结果为 [3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
print([num for num in range(3,100) if num % 10 == 3])

b. 利用列表推到是将 列表中的整数提取出来

例如:[True, 17, "hello", "bye", 98, 34, 21] --- [17, 98, 34, 21]
eg = [True, 17, "hello", "bye", 98, 34, 21]
b = [item for item in eg if type(item) == int]
print(b)

c.利用列表推导式 存放指定列表中字符串的长度

例如 ["good", "nice", "see you", "bye"] --- [4, 4, 7, 3]
str1 = ["good", "nice", "see you", "bye"]
c = [len(item) for item in str1]
print(c)

4.已经一个班级字典如下:

class1 = {    'name': 'python2104',    'address': '23教',    'lecturer': {'name': '余婷', 'age': 18, 'QQ': '726550822'},    'leader': {'name': '舒玲', 'age': 18, 'QQ': '2343844', 'tel': '110'},    'students': [        {'name': 'stu1', 'school': '清华大学', 'tel': '1123', 'age': 18, 'score': 98, 'linkman': {'name': '张三', 'tel': '923'}},        {'name': 'stu2', 'school': '攀枝花学院', 'tel': '8999', 'age': 28, 'score': 76, 'linkman': {'name': '李四', 'tel': '902'}},        {'name': 'stu3', 'school': '成都理工大学', 'tel': '678', 'age': 20, 'score': 53, 'linkman': {'name': '小明', 'tel': '1123'}},        {'name': 'stu4', 'school': '四川大学', 'tel': '9900', 'age': 30, 'score': 87, 'linkman': {'name': '小花', 'tel': '782'}},        {'name': 'stu5', 'school': '西南交大', 'tel': '665', 'age': 22, 'score': 71, 'linkman': {'name': '老王', 'tel': '009'}},        {'name': 'stu6', 'school': '成都理工大学', 'tel': '892', 'age': 32, 'score': 80, 'linkman': {'name': '老王2', 'tel': '0091'}},        {'name': 'stu7', 'school': '四川大学', 'tel': '431', 'age': 17, 'score': 65, 'linkman': {'name': '老王3', 'tel': '0092'}},        {'name': 'stu8', 'school': '攀枝花学院', 'tel': '2333', 'age': 16, 'score': 32, 'linkman': {'name': '老王4', 'tel': '0093'}},        {'name': 'stu9', 'school': '攀枝花学院', 'tel': '565', 'age': 21, 'score': 71, 'linkman': {'name': '老王5', 'tel': '0094'}}    ]}

1)获取班级位置

print(class1['address'])

2)获取班主任的名字和电话

print(class1['leader']['name'], class1['leader']['tel'])

3)获取所有学生的姓名和分数

print([(stu['name'], stu['score']) for stu in class1['students']])

4)获取所有学生联系人的名字和电话

print([(stu['linkman']['name'], stu['linkman']['tel']) for stu in class1['students']])

5)获取班级最高分

print('最高分为:', max([stu['score'] for stu in class1['students']]))
# 最高分为: 98

6)获取班级分数最高的学生的姓名

print('分数最高的学生姓名为:', [stu['name'] for stu in class1['students']
                      if stu['score'] == max([stu['score'] for stu in class1['students']])])
# 分数最高的学生姓名为: ['stu1']

7)计算班级学生的平均分

print('平均分为:', sum([stu['score'] for stu in class1['students']]) / len(class1['students']))
# 平均分为: 70.33333333333333

8)统计班级中未成年人数

print('未成年人数为:', len([stu['name'] for stu in class1['students'] if stu['age'] < 18]))
# 未成年人数为: 2

9)用字典统计每个学校的人数, 类似: {'清华大学': 1, '攀枝花学院': 3}

# 方法1:
nums = {}
for stu in class1['students']:
    if stu['school'] not in nums:
        nums[stu['school']] = nums.get(stu['school'], 1)
        # nums.setdefault(stu['school'], 1) # 方法2
    else:
        nums[stu['school']] += 1
print(nums)

# 改进:
nums = {}
for stu in class1['students']:
    nums[stu['school']] = nums.get(stu['school'], 0) + 1
    # nums[stu['school']] = nums.setdefault(stu['school'], 0) + 1
print(nums)

# {'清华大学': 1, '攀枝花学院': 3, '成都理工大学': 2, '四川大学': 2, '西南交大': 1}
上一篇:Python 元组与字典


下一篇:用Python做卡片管理系统