Python学习日记-----容器基础(一)

59 阅读7分钟

容器基础(二)

@TOC

一、容器类型-公共的运算符

1.分类

字符串列表元组字典集合
+
*
in
not in

2.演示

# 演示 +           表示: 合并(拼接), 可以作用于: 字符串, 列表, 元组
print('aa' + 'bb')
print([1, 2, 3] + [4, 5, 6] + ['a', 'b'])
print((1, 2, 3) + ('a', 'b'))
# print({1, 2, 3} + {'a', 'b'})             # +不支持集合, 因为集合元素具有 唯一性. 合并可能存在重复元素, 然后会自动删除重复的, 无意义.
# print({'name': '张三', 'age': 23} + {'name': '李四', 'address':'北京'})     # +不支持字典, 键具有唯一性.

# 演示 *           表示: 复制, 可以作用于: 字符串, 列表, 元组
print('-' * 28)
print([1, 2, 3] * 2)
print((1, 2, 3) * 2)
# print({1, 2, 3} * 2)    # *不能作用于集合, 集合元素具有唯一性.
# print({'name': '张三', 'age': 23} * 2)    # *不能作用于字典, 键具有唯一性
print('-' * 28)

# 演示 in          表示: 是否在, 可以作用于: 字符串, 列表, 元组, 字典
print('a' in 'abc')
print(10 in [10, 20, 30])
print(10 in (10, 20, 30))
print(10 in {10, 20, 30})
print('name' in {'name': '张三', 'age': 23})  # 字典只能判断是否包含这个键.
print(23 in {'name': '张三', 'age': 23})      # 字典只能判断是否包含这个键.
print('-' * 28)

# 演示 not in      表示: 是否不在, 可以作用于: 字符串, 列表, 元组, 字典
print('a' not in 'abc')
print(10 not in [10, 20, 30])
print(10 not in (10, 20, 30))
print(10 not in {10, 20, 30})
print('name' not in {'name': '张三', 'age': 23})  # 字典只能判断是否包含这个键.
print(23 not in {'name': '张三', 'age': 23})      # 字典只能判断是否包含这个键.

二、容器类型-公共函数

1.主要函数

函数名功能
len()获取长度
del 或者del()删除
max()获取最大值
min()获取最小值
range(start, end, step)生成制定范围内的数据
enumerate()基于可迭代类型(字符串、列表、元组等),生成下标+元素的方式

2.演示

# 此处以列表作为演示, 其它雷同.
list1 = [10, 50, 20, 30, 66, 22]

# 演示: len()                       获取长度
print(len(list1))

# 演示: del 或者 del()               删除
del list1[1]
del(list1[1])      # 效果同上.
print(f'删除后的list1: {list1}')

# 演示: max()                       获取最大值
print(f'最大值: {max(list1)}')

# 演示: min()                       获取最小值
print(f'最大值: {min(list1)}')

# 演示: range(start, end, step)     生成指定范围内的数据
print(f'range生成数据: {range(1, 5, 2)}')           # range生成数据: range(1, 5, 2)
print(f'range生成数据: {list(range(1, 5, 2))}')     # range生成数据: [1, 3]

# 演示: enumerate()                 基于可迭代类型(字符串, 列表, 元组等), 生成 下标 + 元素的方式, 即: ['a', 'b', 'c']  => [(0, 'a'), (1, 'b'), (2, 'c')]
print(f'list1: {list1}')        # [10, 30, 66, 22]
print(enumerate(list1))     # 直接打印是: 枚举对象的地址值, 无意义, 我们来遍历它. <enumerate object at 0x000001DFB75F6640>

for i in enumerate(list1):
    print(i)        # 格式: (下标, 元素值), 且下标默认从 0 开始.

print('-' * 28)

for i in enumerate(list1, 5):
    print(i)        # 格式: (下标, 元素值), 且下标从 5 开始.

三、列表推导式详解

1.介绍

推导式介绍:
概述:
    推导式也叫解析式, 属于Python的一种特有写法, 目的是: 简化我们代码编写的.
分类:
    列表推导式
    集合推导式
    字典推导式
格式:
    变量名 = [变量名 for ... in ... if 判断条件]
    变量名 = {变量名 for ... in ... if 判断条件}
    变量名 = {变量名1:变量名2 for ... in ... if 判断条件}

2.演示

# 需求1: 创建1个 0 ~ 9的列表.
# 方式1: 不使用推导式.
list1 = []
for i in range(10):
    list1.append(i)
print(list1)

# 方式2: 列表推导式.
list2 = [i for i in range(10)]      # 效果同上.
print(list2)

# 方式3: 类型转换.
list3 = list(range(10))
print(list3)
print('-' * 28)


# 需求2: 创建1个 0 ~ 9的 偶数 列表.
# 方式1: 不使用推导式.
list1 = []
for i in range(10):
    if i % 2 == 0:
        list1.append(i)
print(list1)

# 方式2: 列表推导式.
list2 = [i for i in range(10) if i % 2 == 0]      # 效果同上.
print(list2)

# 方式3: 类型转换.
list3 = list(range(0, 10, 2))
print(list3)
print('-' * 28)

# 需求3: 创建列表 => [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

# 方式1: 普通版, 循环嵌套.
list1 = []
for i in range(1, 3):
    for j in range(3):
        # print((i, j))
        # 把 i 和 j 封装成元组.
        # tuple1 = (i, j)
        # list1.append(tuple1)
        list1.append((i, j))
print(list1)

# 方式2: 列表推导式.
list2 = [(i, j) for i in range(1, 3) for j in range(3)]     # 效果同上.
print(list2)
print('-' * 28)

四、集合和字典推导式详解

演示

# 演示 集合推导式.

# 需求1: 生成 0 ~ 9 的偶数 集合.
set1 = {i for i in range(10) if i % 2 == 0}
print(set1)

# 需求2: 创建1个集合, 数据为下方列表的 2次方.
# 目的: 集合元素具有 唯一性, 会自动去重.
list1 = [1, 1, 2]
set2 = {i ** 2 for i in list1}
print(set2)
print('-' * 28)

# 演示 字典推导式, 回顾字典写法: dict1 = {'name':'张三', 'age':23}
# 需求3: 创建1个字典, key是 1 ~ 5的数字, value是该数字的2次方, 例如: {1:2, 2:4, 3:9, 4:16, 5:25}
dict1 = {i: i ** 2 for i in range(1, 6)}
print(dict1)
print('-' * 28)

# 需求4: 把下述的两个列表, 拼接成1个字典.
# 细节: 两个列表的元素个数(长度) 要 一致.
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'male']

dict2 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict2)

五、例题

例题1

1.题干
假设有一个学生信息列表,每个元素包含学生姓名、年龄和成绩。请按照以下要求完成操作
使用 reverse() 方法将列表反转。
使用 sort() 方法按照成绩从高到低对列表进行排序。
输出平均年龄和前三名学生的信息(姓名、年龄和成绩)。
2.解答
students = [('Alice', 20, 85), ('Bob', 19, 92), ('Catherine', 21, 78), ('David', 20, 95), ('Emily', 19, 88)]

# 使用 reverse() 方法将列表反转
students.reverse()
print("反转后的列表:", students)

# 定义一个函数来获取学生的成绩
def get_score(student):
    return student[2]

# 使用 sort() 方法按照成绩从高到低对列表进行排序
students.sort(key=get_score, reverse=True)
print("按成绩从高到低排序后的列表:", students)

# 计算平均年龄
total_age = 0
for student in students:
    total_age += student[1]
average_age = total_age / len(students)
print("平均年龄:", average_age)

# 输出前三名学生的信息
print("前三名学生的信息:")
for i in range(min(3, len(students))):
    print(f"姓名: {students[i][0]}, 年龄: {students[i][1]}, 成绩: {students[i][2]}")

例题2

1.题干
	假设你正在开发一个在线商店的购物车功能,需要编写 Python 代码来处理购物车内的商品。
请完成以下要求:
	已知有一个购物车商品列表 cart = [("Apple", 2), ("Banana", 3), ("Orange", 4), ("Pear", 1)],
其中每个元组表示一种商品及其数量。请使用列表推导式编写代码,实现以下功能:

创建一个新列表 cart_items,其中仅包含购物车中的商品名称(即去除商品数量信息)。
创建一个新列表 expensive_items,其中仅包含购物车商品数量>=3的商品名称。
将购物车中每个商品的数量加倍,并创建一个新的购物车列表 cart_doubled。

请编写上述要求的代码,并输出最终的列表 cart_items、expensive_items 和 cart_doubled。
2.解答
# 创建一个新列表 cart_items,其中仅包含购物车中的商品名称(即去除商品数量信息)。
cart_items = [name[0] for name in cart]
print(cart_items)
# 创建一个新列表 expensive_items,其中仅包含购物车商品数量>=3的商品名称。
expensive_items = [item[0] for item in cart if item[1] >= 3]
print(expensive_items)
# 将购物车中每个商品的数量加倍,并创建一个新的购物车列表 cart_doubled。
cart_doubled = [(item[0], item[1] * 2) for item in cart]
print(cart_doubled)