容器入门       

容器概念:可以容纳多个元素的python数据类型,就是容器
容器分类:字符串str 列表list 元组tuple 集合set 字典dict

#上一节 讲过了 字符串所以这一节 直接从 列表讲起

列表容器

列表是可变类型

列表的定义和知识点

定义空列表: [ ] 或者list()
定义非空列表:[元素1,元素2,元素3,...]
列表支持嵌套[[元素...],[元素.......]]

#### 示例:

```python
# 定义空列表
l1 = []
print(l1, type(l1))
l2 = list()
print(l2, type(l2))
# 定义非空列表
l3 = ['张三', '李四', 10, 20, 3.14, 13.14, True, False]
print(l3, type(l3))

# 列表嵌套
l4 = [l1, l2, l3]
print(l4, type(l4))
```



### 列

列表的下标索引

知识点:
索引: 也叫下标,就是咱们所说的编号,只是这个编号比较特殊,有两套编号
​
正索引:从左到右,从0开始依次递增
负索引:从右到左,从-1开始依次递减
​
列表名[索引]: 查询指定索引位置处的元素
示例:
# 需求:定义非空列表分别存储姓名和年龄
name_list = ['张三', '李四', '王五']
age_list = [18, 28, 38]
# 需求: 分别获取第一个姓名和第一个年龄
print(name_list[0])
print(age_list[0])
# 需求: 分别获取最后一个姓名和最后一个年龄
print(name_list[-1])
print(age_list[-1])
print('-------------------------------------')
# 需求: 定义学生信息列表把姓名和年龄列表再次封装起来
stu_list = [name_list, age_list]
# 需求: 从学生列表中分别获取第一个姓名和第一个年龄
print(stu_list[0][0])
print(stu_list[1][0])
# 需求: 从学生列表中分别获取最后一个姓名和最后一个年龄
print(stu_list[0][-1])
print(stu_list[1][-1])

列表的增删改查(下方的list代表列表名)

增加

list.apend(元素):把指定元素追加到对应的列表中
list.extend(元素):把指定容器中的元素依次取出追加到对应列表中
list.insert(索引,元素)把指定元素插入到对应列别的指定索引位置

list.pop(索引): 把指定索引位置处的元素从列表中删除
del list[索引]:把指定索引位置处的元素从列表中删除
list.remove(元素):把指定元素直接从列表中删除  一次删除一个
list.clear():清空列表中所有元素
del list: 删除整个列表

改 

list[索引] = 新元素     将 对应索引 改成新元素

list[索引]:查询指定索引位置处的元素  
list.count(元素) 查询元素出现在list中的次数 ###如果元素不存在就返回0

list.index(元素): 查询列表中 元素出现在的索引位置##假如有多个只返回一个 不存在就报错

返回第一个位置

len(list):查询列表的长度#也就是元素的总个数

示例
"""列表是可变类型"""
# 0.定义空列表
names = []
print(names)
# 1.增
# 	列表名.append(元素): 把指定元素追加到对应列表中
names.append('张三')
print(names)
# 	列表名.extend(容器): 把指定容器中的元素依次取出追加到对应列表中
names.extend(['张三', '李四', '王五'])
print(names)
# 	列表名.insert(索引,元素): 把指定元素插入到对应列表的指定索引位置
names.insert(0, '熊大')
print(names)
names.insert(1, '熊二')
print(names)
print('-----------------------------------')
# 2.改
# 	列表名[索引] = 新元素 : 修改列表指定索引位置的元素
names[0] = '老大'
print(names)
print('-----------------------------------')
# 3.查
# 	列表名[索引]: 查询指定索引位置处的元素
print(names[0])
# 	列表名.count(元素):查询指定元素在列表中出现的次数    注意:如果元素不存在就返回0
print(names.count('张三'))
#     列表名.index(元素):查询指定元素在列表中出现的索引位置 注意:如果元素不存在就报错,多个只返回第一个位置
print(names.index('张三'))
# print(names.index('张丰')) # 报错
#     len(列表名): 查询指定列表的元素总个数
print(len(names))
print('-----------------------------------')
# 4.删
# 	列表名.pop(索引): 把指定索引位置处元素从列表中删除
names.pop(0)
print(names)
# 	del 列表名[索引]: 把指定索引位置处元素从列表中删除
del names[0]
print(names)
# 	列表名.remove(元素): 把指定元素直接从列表中删除   注意:一次只会删除一个
names.remove('张三')
print(names)
names.remove('张三')
print(names)
# 	列表名.clear(): 清空列表中所有元素
names.clear()
print(names)
# 	del 列表名: 删除整个列表
del names
print(names)  # NameError: name 'names' is not defined

列表的遍历

for i in list:
        循环体

index = 0 
while index <len(list)
        变量 = list[index]##将值赋给变量 或者也可以直接打印list[index]
        循环体
        index+=1

​
"""列表是可变类型"""
# 0.定义空列表
names = []
print(names)
# 1.增
# 	列表名.append(元素): 把指定元素追加到对应列表中
names.append('张三')
print(names)
# 	列表名.extend(容器): 把指定容器中的元素依次取出追加到对应列表中
names.extend(['张三', '李四', '王五'])
print(names)
# 	列表名.insert(索引,元素): 把指定元素插入到对应列表的指定索引位置
names.insert(0, '熊大')
print(names)
names.insert(1, '熊二')
print(names)
print('-----------------------------------')
# 2.改
# 	列表名[索引] = 新元素 : 修改列表指定索引位置的元素
names[0] = '老大'
print(names)
print('-----------------------------------')
# 3.查
# 	列表名[索引]: 查询指定索引位置处的元素
print(names[0])
# 	列表名.count(元素):查询指定元素在列表中出现的次数    注意:如果元素不存在就返回0
print(names.count('张三'))
#     列表名.index(元素):查询指定元素在列表中出现的索引位置 注意:如果元素不存在就报错,多个只返回第一个位置
print(names.index('张三'))
# print(names.index('张丰')) # 报错
#     len(列表名): 查询指定列表的元素总个数
print(len(names))
print('-----------------------------------')
# 4.删
# 	列表名.pop(索引): 把指定索引位置处元素从列表中删除
names.pop(0)
print(names)
# 	del 列表名[索引]: 把指定索引位置处元素从列表中删除
del names[0]
print(names)
# 	列表名.remove(元素): 把指定元素直接从列表中删除   注意:一次只会删除一个
names.remove('张三')
print(names)
names.remove('张三')
print(names)
# 	列表名.clear(): 清空列表中所有元素
names.clear()
print(names)
# 	del 列表名: 删除整个列表
del names
print(names)  # NameError: name 'names' is not defined

​

列表的特点

列表是可变类型
支持容纳多个元素
支持for循环遍历
支持修改操作
能存储任意类型数据
列表可以嵌套
列表有下标索引
因为有索引 所以可以重复

元组容器

元组是不可变类型

定义空元组 tuple_name = ()  ;tuple_name = tuple ()
定义非空元组    tuple_name = (1,2,34,5)
##如果元组里面只有一个元素 必须要有逗号 如 tuple_name = (1,)#否则系统会把括号去掉 以为只是变量赋值

# 定义空元组
t1 = ()
print(t1, type(t1))
t2 = tuple()
print(t2, type(t2))
# 定义非空元组
t3 = ('张三', '李四', 10, 20, 3.14, 13.14, True, False)
print(t3, type(t3))

# 元组嵌套
t4 = (t1, t2, t3)
print(t4, type(t4))

# 注意: 如果是一个元素的元组,一定加逗号!!!
t5 = ('张三',)
print(t5, type(t5))

元组的下标索引

知识点:

索引: 也叫下标,就是咱们所说的编号,只是这个编号比较特殊,有两套编号

正索引:从左到右,从0开始依次递增
负索引:从右到左,从-1开始依次递减

元组名[索引]: 查询指定索引位置处的元素

# 需求:定义非空元组分别存储姓名和年龄
name_tuple = ('张三', '李四', '王五')
age_tuple = (18, 28, 38)
# 需求: 分别获取第一个姓名和第一个年龄
print(name_tuple[0])
print(age_tuple[0])
# 需求: 分别获取最后一个姓名和最后一个年龄
print(name_tuple[-1])
print(age_tuple[-1])
print('-------------------------------------')
# 需求: 定义学生信息元组把姓名和年龄元组再次封装起来
stu_tuple = (name_tuple, age_tuple)
# 需求: 从学生元组中分别获取第一个姓名和第一个年龄
print(stu_tuple[0][0])
print(stu_tuple[1][0])
# 需求: 从学生元组中分别获取最后一个姓名和最后一个年龄
print(stu_tuple[0][-1])
print(stu_tuple[1][-1])

元组的操作(下面的tuple代表元组名)

查询

a = tuple[索引]: 查询索引对应的元素
a= tuple.count(元素): 查询元素出现的次数#如果不存在就返回0
a=tuple.index(元素)查询元素所在位置的索引##返回第一个,不存在就报错
len(tuple):查询元组元素的个数

"""元组是不可变类型"""
# 0.定义非空元组
names = ('张三', '李四', '王五', '张三')
print(names)
# 查
# 	元组名[索引]: 查询指定索引位置处的元素
print(names[0])
# 	元组名.count(元素):查询指定元素在元组中出现的次数    注意:如果元素不存在就返回0
print(names.count('张三'))
#     元组名.index(元素):查询指定元素在元组中出现的索引位置 注意:如果元素不存在就报错,多个只返回第一个位置
print(names.index('张三'))
# print(names.index('张丰')) # 报错
# len(元组名): 查询指定元组的元素总个数
print(len(names))

元组遍历同上

# 需求: 定义非空元组,然后遍历打印元素
names = ('熊大', '熊二', '张三', '李四', '王五')
# for循环方式
# 核心思想: 依次从元组中取出每个元素赋值给临时变量
for name in names:
    print(name)
print('---------------------')
# while循环方式
# 核心思想: 用while循环的变量作为元组的索引使用
index = 0
while index < len(names):
    # 根据索引获取元素  index此时就充当索引使用
    name = names[index]
    print(name)
    # 条件控制
    index += 1

元组的特点

是不可变类型
支持存储多个元素
有索引
支持遍历
有序
可以重复
能存储任意类型数据

序列详解

五大容器中属于序列的有:字符串 列表 元组

1.序列支持切片(截取部分内容)格式-> 序列[开始索引:结束位置:步长]
注意事项如下:
    1.序列有两套索引: 正索引从0开始从左到右依次递增,负索引从-1开始从右到左依次递减
    2.步长决定截取方向: 正步长代表从左到右,负步长代表从右到左 
    3.开始索引:如果留空,默认代表从头开始
    4.结束位置:结束索引=结束位置-1,如果留空默认代表到尾部(含)结束

索引支持运算符如下

s1 = s2+s3 两个序列内容拼接返回一个新的序列
s1 = s2 * x   表示 序列里面的内容乘于x份放回s1中返回

# 定义非空字符串,要求截取'bd'
s = 'abcde'
print(s[1:4:2])

# 定义非空列表,要求截取['b', 'd']
l = ['a', 'b', 'c', 'd', 'e']
print(l[1:4:2])

# 定义非空元组,要求截取('b', 'd')
t = ('a', 'b', 'c', 'd', 'e')
print(t[1:4:2])
# 定义非空字符串
s = 'abcde'
# 定义非空列表
l = ['a', 'b', 'c', 'd', 'e']
# 定义非空元组
t = ('a', 'b', 'c', 'd', 'e')
# + : 序列+序列: 两个序列内容拼接返回一个新序列
print(s + s)
print(l + l)
print(t + t)
print('-------------------------------------')
# * : 序列*x:表示序列的内容乘以x份放到一个新的序列中返回
print(s * 2)
print(l * 2)
print(t * 2)
print('-------------------------------------')
# 注意: +和append操作列表的区别?
# +是拼接返回一个新的列表
print(l + ['f'])
# append是直接修改原有列表
l.append('f')
print(l)

列表的切片

list[开始索引:结束索引:步长]

集合

集合定义空集合  set_name = set()
定义非空集合  set_name = {元素1,元素2,元素3,.....}   ##假如直接用{}定义空集合 会变成字典
集合核心特点:无序不重复       
集合里面只能包含不可变类型如 字符串 整数 布尔 元组 而不能包含列表

# 定义空集合
# 注意: 空的{}代表是字典
d1 = {}
print(d1, type(d1))
print('-------------------------------------------')
s1 = set()
print(s1, type(s1))
# 定义非空集合
# 注意1: 自带去重功能
s2 = {'张三', '李四', 10, 10, 3.14, 3.14, True, False}
print(s2, type(s2))
print('-------------------------------------------')
# 集合嵌套
# 注意2: 集合中只能放不可变类型: 整数,浮点数,布尔值,字符串,元组
# 也就意味着,集合中不能放可变类型: 列表/集合/字典,否则报错TypeError: unhashable type
s3 = {10, 3.14, True, "123", ('a', 'b')}
print(s3, type(s3))

集合的增删改查


set.add(元素):把元素添加到集合内

删除
set.pop() 随机删除一个内容  ###其实是有规律的 按照哈希值 最小的 删除 但是我们没有索引下标 所以不知道 并且每一次哈希值 都会变动所以删的确实不一定 不要依赖这个
set.remove(元素) 移除指定元素
set.clear() 清空集合内的元素但是 集合还在
del set 删除集合 ##此时打印该集合会报错

set1.difference_update(集合2):修改集合1的内容为他和集合2的元素的差集
set1.update(集合2) 并集
##集合不能真正的直接从里面直接更改具体内容 而是先删除再加入  因为要判断是否重复 只有加入进去的时候才会做 这个判断 这也是 为什么 集合里面不能有可变内容了 假如 直接改变内容但是不做去重操作 这个就报废了  


        len(set) 查询集合的元素个数

"""集合是可变类型"""
# 0.定义空集合
names = set()
print(names)
# 1.增
# 	集合名.add(元素): 把指定元素追加到对应集合中
names.add('张三')
names.add('李四')
names.add('王五')
print(names)
print('-----------------------------------')
# 2.改
# 修改为和集合{'张三','赵六'}的差集
names.difference_update({'张三','赵六'})
print(names)
# 修改为何集合{'张三','赵六'}的并集
names.update({'张三','赵六'})
print(names)
print('-----------------------------------')
# 3.查

# len(集合名): 查询指定集合的元素总个数
print(len(names))
print('-----------------------------------')
# 4.删
# 	集合名.pop(): 随机删除一个
names.pop()
print(names)
# 	集合名.remove(元素): 把指定元素直接从集合中删除   注意:一次只会删除一个
names.remove('张三')
print(names)
# 	集合名.clear(): 清空集合中所有元素
names.clear()
print(names)
# 	del 集合名: 删除整个集合
del names
# print(names)  # NameError: name 'names' is not defined

集合的遍历

for遍历如上
但是没有while 循环 因为 没有索引 所以不能遍历

# 需求: 定义非空集合,然后遍历打印元素
names = {'老大', '熊二', '张三', '李四', '王五'}
# for循环方式
# 核心思想: 依次从集合中取出每个元素赋值给临时变量
for name in names:
    print(name)

集合的特点

集合是可变类型
支持容纳多个元素
支持for循环
支持修改操作
只能存储不可变类型
没有下标索引 所以 不支持while  无序  不重复

字典

空字典 dict_name = {}  和 dict_name = dice()

定义非空字典 dict_name = {k1:v1,k2:v2,...............}
###键key:只能是不可变类型且不能重复 值 value 可以是任意类型并且可以重复

# 定义空字典
d1 = {}
print(d1, type(d1))
d2 = dict()
print(d2, type(d2))
# 定义非空字典
d3 = {"张三": 18, "李四": 28, '王五': 38}
print(d3, type(d3))
# 字典的嵌套
# 注意: key不能重复且不能是可变类型: 列表,集合,字典
# key只能是不可变类型: 整数,浮点数,布尔值,字符串,元组
d4 = {1: d1, 2: d2, 3: d3}
print(d4, type(d4))
# 综合案例:定义字典,存储每个学生的成绩:语文,数学,英语
score_dict = {
    "张三": {'语文': 99, '数学': 88, '英语': 98},
    "李四": {'语文': 89, '数学': 68, '英语': 100},
    "王五": {'语文': 79, '数学': 98, '英语': 99},
}
print(score_dict, type(score_dict))

字典的增删改查

增加
        dict[新key] = value:在字典中增加一个新的键值对


        dict[key] = 新value 将已有的key 的 value 变成 新的value

###也可以理解为 有的话 就改变 没有的话就创建

删除
        dict.pop(key):删除key的键值对
        del dict[key]: 删除key的键值对
        dict.clear(): 清空字典
        del dict 删除整个字典

查询
        dict[key],根据key获取value
        dict.get(key),根据key获得value
        len(dict):查询字典里面键值对的个数
        dict.keys():或者字典中所有的键
        dict.values()

"""字典是可变类型"""
# 定义空字典,存储学生的成绩
score_dict = {}
print(score_dict)
# 1.增
# 	字典名[新key] = value : 在字典中添加一个键值对 新key:value
score_dict['李四'] = 80
score_dict['王五'] = 90
score_dict['赵六'] = 90
score_dict['张三'] = 99
score_dict['张三'] = 100
score_dict['田七'] = 100
print(score_dict)
print('-------------------------------------------------')
# 2.改
# 	字典名[旧key] = value : 在字典中修改旧key对应的值为value
# 需求: 修改王五的成绩为99
score_dict['王五'] = 99
print(score_dict)
print('-------------------------------------------------')
# 3.查
# 	字典名[key]:  根据key获取value
print(score_dict['张三'])
# 	字典名.get(key):  根据key获取value
print(score_dict.get('王五'))
#     len(字典名): 获取字典中键值对的个数
print(len(score_dict))
#     字典名.keys(): 获取所有的key
# 需求: 获取所有的姓名
names = list(score_dict.keys())
print(names, type(names))
#     字典名.values(): 获取所有的values
# 需求: 获取所有的分数
scores = list(score_dict.values())
print(scores, type(scores))
#     字典名.items(): 获取所有的键值对  注意: 每个键值对都单独封装为元组
# 需求: 获取所有的键值对
kvs = score_dict.items()
print(kvs)
print('-------------------------------------------------')
# 4.删
# 	字典名.pop(key): 根据key删除对应的键值对
score_dict.pop('张三')
print(score_dict)
# 	del 字典名[key]: 根据key删除对应的键值对
del score_dict['王五']
print(score_dict)
# 	字典名.clear(): 清空字典中所有元素
score_dict.clear()
print(score_dict)
# 	del 字典名: 删除整个字典
del score_dict
# print(score_dict) # NameError: name 'score_dict' is not defined

字典的遍历

for k in dict:
        v = dict[k]
        循环体
###字典里的遍历 只能获得key 在不用函数的情况下 ,所以只能在循环体里面用k得到对应v的值
或者还有底下的这种方法

for k,v in dict.items:
        print(k,v)
        循环体

#这用到了函数和拆包 就可以直接把k v都拿到

# 定义非空字典,要求遍历打印格式为: xx分数是yy
score_dict = {'李四': 80, '王五': 99, '赵六': 90, '张三': 100, '田七': 100}
# 方式1.1(推荐): 直接遍历字典(默认获取的键)
for k in score_dict:
    # 根据k获取v
    # v = score_dict[k]
    v = score_dict.get(k)
    # 格式化输出
    print(f"{k}的分数是:{v}")
print('---------------------------')
# 方式1.2(了解): 先获取所有的key,然后遍历依次获取value
for k in score_dict.keys():
    # 根据k获取v
    # v = score_dict[k]
    v = score_dict.get(k)
    # 格式化输出
    print(f"{k}的分数是:{v}")
print('---------------------------')
# 方式2(推荐): 先获取所有的键值对,然后拆包直接拿到k,v
for k, v in score_dict.items():
    # 格式化输出
    print(f"{k}的分数是:{v}")

字典的特点
字典是可变类型

支持for循环遍历
支持修改操作
每个元素是键值对,key只能是不可变类型 原理和集合一样,value可以是任意类型
没有索引所以
不支持while
无序
键不能重复

推导式

五大容器中支持推导式的有 列表 集合 字典

知识点:

Python 的推导式(Comprehension)是一种简洁、优雅的语法,用于创建数据结构。它能够通过一行代码生成列表、字典、集合或生成器表达式。

# 需求: 生成存储了1-10的列表
# 方式1: 原始方式
# 1.定义空列表
nums1 = []
# 2.循环依次生成1-10,依次放到列表中
for i in range(1, 11):
    # i依次代表1-10,然后依次放到列表中
    nums1.append(i)

# 3.使用列表
print(nums1)

# 方式2: 推导式
nums2 = [i for i in range(1, 11)]
print(nums2)
print('---------------------------------------------')
# 需求: 生成一个存储了1-10中偶数的列表
# 方式1: 原始方式
# 1.定义空列表
nums1 = []
# 2.循环依次生成1-10,依次放到列表中
for i in range(1, 11):
    # 如果是偶数放到列表中
    if i % 2 == 0:
        # i依次代表1-10,然后依次放到列表中
        nums1.append(i)

# 3.使用列表
print(nums1)

# 方式2: 推导式
nums2 = [i for i in range(1, 11) if i % 2 == 0]
print(nums2)
# 需求: 生成存储了1-10的集合
# 方式1: 原始方式
# 1.定义空集合
nums1 = set()
# 2.循环依次生成1-10,依次放到集合中
for i in range(1, 11):
    # i依次代表1-10,然后依次放到集合中
    nums1.add(i)

# 3.使用集合
print(nums1)

# 方式2: 推导式
nums2 = {i for i in range(1, 11)}
print(nums2)
# 需求: 生成存储了1:1-10:10的字典
# 方式1: 原始方式
# 1.定义空字典
nums1 = {}
# 2.循环依次生成1-10,依次放到字典中
for i in range(1, 11):
    # i依次代表1-10,然后依次放到字典中
    nums1[i] = i

# 3.使用字典
print(nums1)

# 方式2: 推导式
nums2 = {i: i for i in range(1, 11)}
print(nums2)

生成器推导式
nums = (i for i in range(1,11))
print(nums)
##此时打印出来 不是一串数字 而是推导式 的地址
需要将nums给转换成tuple 才能把推导式出来的东西 拿到手
其他也是同理只是省略了这一步
t1 = tuple(nums)
print(t1)

五大容器总结对比
是否是序列
        序列:列表,元组,字符串
        非序列 集合 字典

是否 是可变类型
        可变类型:列表,集合,字典
        不可变类型:字符串,元组

# 1.定义五大容器
# 定义非空字符串
s = 'cbedaa'
# 定义非空列表
l = ['c', 'b', 'e', 'd', 'a', 'a']
# 定义非空元组
t = ('c', 'b', 'e', 'd', 'a', 'a')
# 定义非空集合
se = {'c', 'b', 'e', 'd', 'a', 'a'}
# 定义非空字典
d = {'c': 1, 'b': 1, 'e': 1, 'd': 1, 'a': 1, 'a': 1}
print('---------------------------------------------------')
# 2.演示通用操作
# len()获取容器中元素个数
print(len(s))
print(len(l))
print(len(t))
print(len(se))
print(len(d))
print('---------------------------------------------------')
# min()获取容器中最小元素
print(min(s))
print(min(l))
print(min(t))
print(min(se))
print(min(d))
print('---------------------------------------------------')
# max()获取容器中最大元素
print(max(s))
print(max(l))
print(max(t))
print(max(se))
print(max(d))
print('---------------------------------------------------')
# max()获取容器中最大元素
print(max(s))
print(max(l))
print(max(t))
print(max(se))
print(max(d))
print('---------------------------------------------------')
# sorted(容器)默认升序排序
print(sorted(s))
print(sorted(l))
print(sorted(t))
print(sorted(se))
print(sorted(d))
print('---------------------------------------------------')
# sorted(容器,reverse)反转
print(sorted(s, reverse=True))
print(sorted(l, reverse=True))
print(sorted(t, reverse=True))
print(sorted(se, reverse=True))
print(sorted(d, reverse=True))
print('---------------------------------------------------')
# in : 判断指定元素是否在容器中
print('c' in s)
print('c' in l)
print('c' in t)
print('c' in se)
print('c' in d)
print('---------------------------------------------------')
# not in : 判断指定元素是否不在容器中
print('c' not in s)
print('c' not in l)
print('c' not in t)
print('c' not in se)
print('c' not in d)
print('---------------------------------------------------')
# 拆包
a, b, c = '123'
print(a, b, c)
a, b, c = [1, 2, 3]
print(a, b, c)
a, b, c = (1, 2, 3)
print(a, b, c)
a, b, c = {1, 2, 3}
print(a, b, c)
a, b, c = {1: 'a', 2: 'a', 3: 'a'}
print(a, b, c)

# 定义非空列表
l = [2, 1, 3, 1]
# 定义非空元组
t = (2, 1, 3, 1)
# 定义非空字符串
s = '2131'
# 定义非空集合
ss = {2, 1, 3, 1}
# 定义非空字典
d = {2: 'a', 1: 'a', 3: 'a', 1: 'a'}

# list(其他容器): 把其他容器转换为列表
print(list(t))
print(list(s))
print(list(ss))
print(list(d))
print('----------------')
# tuple(其他容器): 把其他容器转换为元组
print(tuple(l))
print(tuple(s))
print(tuple(ss))
print(tuple(d))
print('----------------')
# set(其他容器): 把其他容器转换为集合
print(set(l))
print(set(t))
print(set(s))
print(set(d))
print('----------------')
# str(其他容器): 把其他容器转换为字符串
print(str(l))  # '[2, 1, 3, 1]'
print(str(t))  # '(2, 1, 3, 1)'
print(str(ss))  # '{1, 2, 3}'
print(str(d))  # "{2: 'a', 1: 'a', 3: 'a'}"
print('----------------')

# TODO 需求: 上述的字符串结果,如何再转换回去?
print(list('[2, 1, 3, 1]'))  # 结果是有问题的
print(tuple('(2, 1, 3, 1)'))  # 结果是有问题的
print(set('{1, 2, 3}'))  # 结果是有问题的
# print(dict("{2: 'a', 1: 'a', 3: 'a'}")) # 结果报错
print('-----------------------------------------------------------')

# TODO 拓展:
# TODO 思路: 如何把引号去掉? 方式1: 手动删除两端引号   方式2: eval(字符串)自动去除引号
print(eval('[2, 1, 3, 1]'))  # 结果转为列表
print(eval('(2, 1, 3, 1)'))  # 结果转为元组
print(eval('{1, 2, 3}'))  # 结果转为集合
print(eval("{2: 'a', 1: 'a', 3: 'a'}"))  # 结果转为字典
print('-----------------------------------------------------------')
# eval可以把字符串中是整数,浮点数,布尔值的变成本身类型
print(eval('10'))
print(eval('3.14'))
print(eval('True'))
# 但是eval不要直接去除非整数,浮点数,布尔值,容器意外的引号!!!
# print(eval('你好')) # 报错

更多推荐