Python-第六天 Python数据容器

news2025/2/27 7:18:22

Python-第六天 Python数据容器

  • 一、数据容器入门
    • 1.数据容器
  • 二、数据容器:list(列表)
    • 1.列表的定义
    • 2.列表的下标(索引)
    • 3.列表的常用操作(方法)
    • 4.练习案例:常用功能练习
    • 5.list(列表)的遍历
      • 5.1 列表的遍历 - while循环
      • 5.2 列表的遍历 - for 循环
      • 5.3 while循环和for循环的对比
      • 5.4 练习
  • 三、数据容器:tuple(元组)
    • 1.元祖的定义
    • 2.元祖的操作
    • 3.元祖的特点
    • 4.练习案例:元组的基本操作
  • 四、数据容器:str(字符串)
    • 1.再识字符串
    • 2.字符串的下标(索引)
    • 3.字符串常用操作汇总
    • 4.字符串的遍历
    • 5.字符串的特点
    • 6.练习案例:分割字符串
  • 五、数据容器的切片
    • 1.序列
    • 2.序列的常用操作 - 切片
    • 3.练习案例:序列的切片实践
  • 六、数据容器:set(集合)
    • 1.定义和基本语法
    • 2.常用方法
    • 3.集合的特点
    • 4.练习案例:信息去重
  • 七、数据容器:dict(字典、映射)
    • 1.定义和基本语法
    • 2.常用方法
    • 3.字典的嵌套
    • 3.字典的特点
    • 4.案例:升职加薪
  • 八、数据容器的通用操作
    • 1.数据容器对比总结
    • 2.通用操作
    • 3.字符串比较大小
  • 九、综合案例

一、数据容器入门

1.数据容器

Python中的数据容器:
一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素
每一个元素,可以是任意类型的数据,如字符串、数字、布尔等。

数据容器根据特点的不同,如:

  • 是否支持重复元素
  • 是否可以修改
  • 是否有序,等

分为5类,分别是:

列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)

我们将一一学习它们
在这里插入图片描述

二、数据容器:list(列表)

1.列表的定义

基本语法:

# 字面量
[元素1,元素2,元素3,元素4,...]

# 定义变量
变量名称 = [元素1,元素2,元素3,元素4,...]

# 定义空列表
变量名称 = []
变量名称 = list()

列表内的每一个数据,称之为元素

  • [] 作为标识
  • 列表内每一个元素之间用, 逗号隔开
  • 注意:列表可以一次存储多个数据,且可以为不同的数据类型,支持嵌套

示例:

my_list1 = ['ithema',"itcast","""python"""]
my_list2 = ['itheima',666,True]
my_list3 = [1,2,3,[4,5,6]]
print(f'{my_list1} 列表的类型为:{type(my_list1)}')
print(f'{my_list2} 列表的类型为:{type(my_list2)}')
print(f'{my_list3} 列表的类型为:{type(my_list3)}')

在这里插入图片描述

2.列表的下标(索引)

我们可以使用下标索引从列表中取出特定位置的数据

在这里插入图片描述

如图,列表中的每一个元素,都有其位置下标索引,从前向后的方向,从0开始,依次递增
我们只需要按照下标索引,即可取得对应位置的元素。

基本语法

# 语法: 列表[下标索引]

name_list = ['Tom','zs','ls']
print(name_list[0])  # 结果 :Tom
print(name_list[1])  # 结果 :zs
print(name_list[2])  # 结果 :ls

在这里插入图片描述
或者,可以反向索引,也就是从后向前:从-1开始,依次递减(-1、-2、-3......)

在这里插入图片描述

如图,从后向前,下标索引为:-1、-2、-3,依次递减。

如果列表是嵌套的列表,同样支持下标索引

在这里插入图片描述

如图,下标就有2个层级了。

要注意下标索引的取值范围,超出范围无法取出元素,并且会报错

3.列表的常用操作(方法)

列表除了可以:

  • 定义
  • 使用下标索引获取值

以外,列表也提供了一系列功能:

  • 插入元素
  • 删除元素
  • 清空列表
  • 修改元素
  • 统计元素个数

等等功能,这些功能我们都称之为:列表的方法
在这里插入图片描述

示例:

# 查询功能  列表.index(元素)
my_list =['itheima','itcast','python']
print(my_list.index('itcast'))  #结果 :1

# 修改功能

# 1.修改特定位置元素的值 列表[下标] = 值  正向、反向下标均可
# 1.1正向下标
my_list = [1,2,3]
my_list[0] = 5
print(my_list) # 结果:[5,2,3]
# 1.2.反向下标
my_list = [1,2,3]
my_list[-3] = 5
print(my_list) # 结果:[5,2,3]

# 2.插入元素 列表.insert(下标,元素) 在指定的下标位置,插入指定的元素
my_list = [1,2,3]
my_list.insert(1,'itheima')
print(my_list) # 结果:[1,'itheima',2,3]

# 3.追加元素
# 3.1 列表.append(元素) 将指定元素,追加到列表尾部
my_list = [1,2,3]
my_list.append([4,5,6])
print(my_list) # 结果:[1,2,3,[4,5,6]]
# 3.2 列表.extend(其他数据容器) 将其他数据容器的内容取出,依次追加到列表尾部
my_list = [1,2,3]
my_list.extend([4,5,6])
print(my_list) # 结果:[1,2,3,4,5,6]

# 4.删除元素
# 4.1 del 列表[下标]
my_list = [1,2,3]
del my_list[0]
print(my_list)  # 结果:[2,3]
# 4.2 列表.pop(下标)
my_list = [1,2,3]
my_list.pop(0)
print(my_list)  # 结果:[2,3]
# 4.3 列表.remove(元素) 删除某元素在列表中的第一个匹配项
my_list = [1,2,3,2,3]
my_list.remove(2)
print(my_list) # 结果:[1,3,2,3]
# 4.4 列表.clear() 清空列表
my_list = [1,2,3,2,3]
my_list.clear()
print(my_list) # 结果:[]

# 列表.count(元素) 统计某元素在列表中的数量
my_list = [1,1,3,1,3]
print(my_list.count(1)) # 结果:3

# len(列表) 统计列表内的元素个数
my_list = [1,1,3,1,3]
print(len(my_list)) # 结果:5

经过上述对列表的学习,可以总结出列表有如下特点:

  • 可以容纳多个元素(上限为2**63-1、9223372036854775807个)
  • 可以容纳不同类型的元素(混装)
  • 数据是有序存储的(有下标序号)
  • 允许重复数据存在
  • 可以修改(增加或删除元素等)

4.练习案例:常用功能练习

有一个列表,内容是:[21, 25, 21, 23, 22, 20],记录的是一批学生的年龄

请通过列表的功能(方法),对其进行

  1. 定义这个列表,并用变量接收它
  2. 追加一个数字31,到列表的尾部
  3. 追加一个新列表[29, 33, 30],到列表的尾部
  4. 取出第一个元素(应是:21)
  5. 取出最后一个元素(应是:30)
  6. 查找元素31,在列表中的下标位置
# 定义这个列表,并用变量接收它
age_list = [21, 25, 21, 23, 22, 20]
print(age_list)
# 追加一个数字31,到列表的尾部
age_list.append(31)
print(age_list)
# 追加一个新列表[29, 33, 30],到列表的尾部
age_list.extend([29,33,30])
print(age_list)
# 取出第一个元素(应是:21)
print(age_list[0])
# 取出最后一个元素(应是:30)
print(age_list[-1])
# 查找元素31,在列表中的下标位置
print(age_list.index(31))

在这里插入图片描述

5.list(列表)的遍历

5.1 列表的遍历 - while循环

语法

index = 0
while index < len(列表):
    元素 = 列表[index]
    对元素处理
    index +=1

5.2 列表的遍历 - for 循环

语法

for 临时变量 in 数据容器:
    对临时变量处理

5.3 while循环和for循环的对比

while循环和for循环,都是循环语句,但细节不同:

在循环控制上:

  • while循环可以自定循环条件,并自行控制
  • for循环不可以自定循环条件,只可以一个个从容器内取出数据

在无限循环上:

  • while循环可以通过条件控制做到无限循环
  • for循环理论上不可以,因为被遍历的容器容量不是无限的

在使用场景上:

  • while循环适用于任何想要循环的场景
  • for循环适用于,遍历数据容器的场景或简单固定次数循环场景

5.4 练习

定义一个列表,内容是:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
遍历列表,取出列表内的偶数,并存入一个新的列表对象中
使用while循环和for循环各操作一次

在这里插入图片描述

提示:

  • 通过if判断来确认偶数
  • 通过列表的append方法,来增加元素
"""
定义一个列表,内容是:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
遍历列表,取出列表内的偶数,并存入一个新的列表对象中
使用while循环和for循环各操作一次

提示:
通过if判断来确认偶数
通过列表的append方法,来增加元素

"""
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_list = []
index = 0
#while
while index < len(my_list):
    if my_list[index] % 2 == 0:
        even_list.append(my_list[index])
    index+=1
print(f'通过while循环,从列表:{my_list}中取出偶数,组成新列表:{even_list}')

# for
even_list = []
for el in my_list:
    if el % 2 == 0:
        even_list.append(el)
print(f'通过for循环,从列表:{my_list}中取出偶数,组成新列表:{even_list}')

三、数据容器:tuple(元组)

1.元祖的定义

元组定义:定义元组使用小括号,且使用逗号隔开各个数据,数据可以是不同的数据类型

语法

# 定义元祖字面量
(元素1,元素2,元素3,元素4,....)
# 定义元祖变量
变量名称 = (元素1,元素2,元素3,元素4,....)
# 定义空元祖
变量名称 = ()
变量名称 = tuple()
# 元祖也支持嵌套
t1 = ((1,2,3),(4,5,6))

注意:

  • 元组一旦定义完成,就不可修改.所以,当我们需要在程序内封装数据,又不希望封装的数据被篡改,那么元组就非常合适
  • 元祖只有一个数据,这个数据后面要加逗号 (元素1,)

2.元祖的操作

在这里插入图片描述
示例:

t = (1,2,'hello',3,4,'hello',1)
# 根据下标取出数据
print(t[2])  # 结果为 hello
#  index() 查找某个数据,如果数据存在返回对应的下标,否则报错
print(t.index('hello'))  # 结果为 2
# count() 统计某个数据在当前元组出现的次数
print(t.count(1)) # 结果为 2
# len(元组) 统计元组内的元素个数
print(len(t))   # 结果为 7

3.元祖的特点

  • 可以容纳多个数据
  • 可以容纳不同类型的数据(混装)
  • 数据是有序存储的(下标索引)
  • 允许重复数据存在
  • 不可以修改(增加或删除元素等)
  • 支持for循环

多数特性和list一致,不同点在于不可修改的特性。

4.练习案例:元组的基本操作

定义一个元组,内容是:(‘周杰轮’, 11, [‘football’, ‘music’]),记录的是一个学生的信息(姓名、年龄、爱好)

请通过元组的功能(方法),对其进行

  • 查询其年龄所在的下标位置
  • 查询学生的姓名
  • 删除学生爱好中的football
  • 增加爱好:coding到爱好list内
t =('周杰轮', 11, ['football', 'music'])
print(t.index(11))
print(t[0])
t[-1].remove('football')
print(t)
t[-1].append('coding')
print(t)

四、数据容器:str(字符串)

1.再识字符串

尽管字符串看起来并不像:列表、元组那样,一看就是存放了许多数据的容器。
但不可否认的是,字符串同样也是数据容器的一员。

在这里插入图片描述

字符串是字符的容器,一个字符串可以存放任意数量的字符。
如,字符串:“itheima”

2.字符串的下标(索引)

和其它容器如:列表、元组一样,字符串也可以通过下标进行访问

  • 从前向后,下标从0开始
  • 从后向前,下标从-1开始

同元组一样,字符串是一个:无法修改的数据容器
所以:

  • 修改指定下标的字符 (如:字符串[0] = “a”)
  • 移除特定下标的字符 (如:del 字符串[0]、字符串.remove()、字符串.pop()等)
  • 追加字符等 (如:字符串.append())
    均无法完成。如果必须要做,只能得到一个新的字符串,旧的字符串是无法修改

3.字符串常用操作汇总

在这里插入图片描述

4.字符串的遍历

同列表、元组一样,字符串也支持while循环和for循环进行遍历

5.字符串的特点

作为数据容器,字符串有如下特点:

  • 只可以存储字符串
  • 长度任意(取决于内存大小)
  • 支持下标索引
  • 允许重复字符串存在
  • 不可以修改(增加或删除元素等)
  • 支持for循环

基本和列表、元组相同

不同与列表和元组的在于:字符串容器可以容纳的类型是单一的,只能是字符串类型
不同于列表,相同于元组的在于:字符串不可修改

6.练习案例:分割字符串

给定一个字符串:“itheima itcast boxuegu”

  • 统计字符串内有多少个"it"字符
  • 将字符串内的空格,全部替换为字符:“|”
  • 并按照"|"进行字符串分割,得到列表

在这里插入图片描述

提示:
count、replace、split

str = "itheima itcast boxuegu"
print(f'字符串{str}中有:{str.count("it")}个it字符')
str1 = str.replace(' ','|')
print(f'字符串{str},被替换空格后,结果:{str1}')
list = str1.split('|')
print(f'字符串{str1},按照|分隔后,结果:{list}')

五、数据容器的切片

1.序列

序列是指:内容连续、有序,可使用下标索引的一类数据容器
列表、元组、字符串,均可以可以视为序列。

在这里插入图片描述
在这里插入图片描述

如图,序列的典型特征就是:有序并可用下标索引,字符串、元组、列表均满足这个要求

2.序列的常用操作 - 切片

序列支持切片,即:列表、元组、字符串,均支持进行切片操作
切片:从一个序列中,取出一个子序列

语法

序列[起始下标:结束下标:步长]

表示从序列中,从指定位置开始,依次取出元素,到指定位置结束,得到一个新序列:

  • 起始下标表示从何处开始,可以留空,留空视作从头开始
  • 结束下标(不含)表示何处结束,可以留空,留空视作截取到结尾
  • 步长表示,依次取元素的间隔
  • 步长1表示,一个个取元素
  • 步长2表示,每次跳过1个元素取
  • 步长N表示,每次跳过N-1个元素取
  • 步长为负数表示,反向取(注意,起始下标和结束下标也要反向标记)

注意,此操作不会影响序列本身,而是会得到一个新的序列(列表、元组、字符串)

示例:

my_list = [1, 2, 3, 4, 5]
new_list = my_list[1:4]	# 下标1开始,下标4(不含)结束,步长1
print(new_list)		# 结果:[2, 3, 4]

my_tuple = (1, 2, 3, 4, 5)
new_tuple = my_tuple[:]	# 从头开始,到最后结束,步长1
print(new_tuple)		# 结果:(1, 2, 3, 4, 5)

my_list = [1, 2, 3, 4, 5]
new_list = my_list[::2]		# 从头开始,到最后结束,步长2
print(new_list)		# 结果:[1, 3, 5]

my_str = "12345"
new_str = my_str[:4:2]	# 从头开始,到下标4(不含)结束,步长2
print(new_str)		# 结果:"13"

my_str = "12345"
new_str = my_str[::-1]	# 从头(最后)开始,到尾结束,步长-1(倒序)
print(new_str)		# 结果:"54321"

my_list = [1, 2, 3, 4, 5]
new_list = my_list[3:1:-1]	# 从下标3开始,到下标1(不含)结束,步长-1(倒序)
print(new_list)		# 结果:[4, 3]

my_tuple = (1, 2, 3, 4, 5)
new_tuple = my_tuple[:1:-2] 	# 从头(最后)开始,到下标1(不含)结束,步长-2(倒序)
print(new_tuple)		# 结果:(5, 3)

3.练习案例:序列的切片实践

有字符串:“万过薪月,员序程马黑来,nohtyP学”
请使用学过的任何方式,得到"黑马程序员"

可用方式参考:
倒序字符串,切片取出或切片取出,然后倒序
split分隔"," replace替换"来"为空,倒序字符串

str = "万过薪月,员序程马黑来,nohtyP学"
print(str[9:4:-1])
print(str[::-1][9:14])
print(str[5:10][::-1])
print(str.split(',')[1].replace("来","")[::-1])

六、数据容器:set(集合)

1.定义和基本语法

# 定义集合字面量
{元素,元素,...,元素}
# 定义集合变量
变量名称 = {元素,元素,...,元素}
# 定义空集合
变量名称 = set()

和列表、元组、字符串等定义基本相同:

  • 列表使用:[]
  • 元组使用:()
  • 字符串使用:“”
  • 集合使用:{}

首先,因为集合是无序的,所以集合不支持:下标索引访问
但是集合和列表一样,是允许修改的,所以我们来看看集合的修改方法。

2.常用方法

在这里插入图片描述

  • 添加新元素
    语法:集合.add(元素)。将指定元素,添加到集合内
    结果:集合本身被修改,添加了新元素

  • 移除元素
    语法:集合.remove(元素),将指定元素,从集合内移除
    结果:集合本身被修改,移除了元素

  • 从集合中随机取出元素
    语法:集合.pop(),功能,从集合中随机取出一个元素
    结果:会得到一个元素的结果。同时集合本身被修改,元素被移除

  • 清空集合
    语法:集合.clear(),功能,清空集合
    结果:集合本身被清空

  • 取出2个集合的差集
    语法:集合1.difference(集合2),功能:取出集合1和集合2的差集(集合1有而集合2没有的)
    结果:得到一个新集合,集合1和集合2不变

  • 消除2个集合的差集
    语法:集合1.difference_update(集合2)
    功能:对比集合1和集合2,在集合1内,删除和集合2相同的元素。
    结果:集合1被修改,集合2不变

  • 2个集合合并
    语法:集合1.union(集合2)
    功能:将集合1和集合2组合成新集合
    结果:得到新集合,集合1和集合2不变

  • 查看集合的元素数量
    语法:len(集合)
    功能:统计集合内有多少元素
    结果:得到一个整数结果

  • 集合同样支持使用for循环遍历

  • 要注意:集合不支持下标索引,所以也就不支持使用while循环。

my_set = {'Hello','World'}
my_set.add('itheima')
print(my_set)  # 结果{'Hello','World','itheima'}

my_set = {'Hello','World','itheima'}
my_set.remove('Hello')
print(my_set)  # 结果{'World','itheima'}

my_set = {'Hello', 'World', 'itheima'}
my_set.clear()
print(my_set)  # 结果{}

my_set = {'Hello', 'World', 'itheima'}
element = my_set.pop()
print(my_set)  # 结果{'itheima','World'}
print(element)  # 结果 'Hello'

set1 = {1, 2, 3}
set2 = {1, 5, 6}
set3 = set1.difference(set2)  # 得到新集合
print(set3)   # 结果 {2,3}
print(set1)   # 结果 {1,2,3} 不变
print(set2)   # 结果 {1,5,6} 不变

set1 = {1, 2, 3}
set2 = {1, 5, 6}
set1.difference_update(set2)
print(set1)   # 结果 {2,3}
print(set2)   # 结果 {1,5,6} 不变

set1 = {1, 2, 3}
set2 = {1, 5, 6}
set3 = set1.union(set2)  # 得到新集合
print(set3)   # 结果 {1,2,3,5,6}
print(set1)   # 结果 {1,2,3} 不变
print(set2)   # 结果 {1,5,6} 不变

set1 = {1, 2, 3}
print(len(set1))  # 结果 3

set1 = {1, 2, 3}
for i in set1:
    print(i)
 # 结果
 # 1
 # 2
 # 3

3.集合的特点

经过上述对集合的学习,可以总结出集合有如下特点:

  • 可以容纳多个数据
  • 可以容纳不同类型的数据(混装)
  • 数据是无序存储的(不支持下标索引)
  • 不允许重复数据存在
  • 可以修改(增加或删除元素等)
  • 支持for循环

4.练习案例:信息去重

有如下列表对象:
my_list = [‘黑马程序员’, ‘传智播客’, ‘黑马程序员’, ‘传智播客’, ‘itheima’, ‘itcast’, ‘itheima’, ‘itcast’, ‘best’]

请:

  • 定义一个空集合
  • 通过for循环遍历列表
  • 在for循环中将列表的元素添加至集合
  • 最终得到元素去重后的集合对象,并打印输出
    在这里插入图片描述
my_list = ['黑马程序员', '传智播客', '黑马程序员', '传智播客',
           'itheima', 'itcast', 'itheima', 'itcast', 'best']
# 方法1
# set1 = set(my_list)

# 方法2
set1 = set()
for i in my_list:
    set1.add(i)
print(set1)

七、数据容器:dict(字典、映射)

1.定义和基本语法

字典的定义,同样使用{},不过存储的元素是一个个的:键值对,如下语法:

# 定义字典字面量
{key: value, key: value, ..., key: value}
# 定义字典变量
my_dict = {key: value, key: value, ..., key: value}
# 定义空自定空字典
my_dict = {}
my_dict = dict()
  • 使用{}存储原始,每一个元素是一个键值对
  • 每一个键值对包含Key和Value(用冒号分隔)
  • 键值对之间使用逗号分隔
  • Key和Value可以是任意类型的数据(key不可为字典)
  • Key不可重复,重复会对原有数据覆盖

2.常用方法

在这里插入图片描述

  • 字典同集合一样,不可以使用下标索引
    但是字典可以通过Key值来取得对应的Value 字典[Key]

  • 新增元素
    语法:字典[Key] = Value,结果:字典被修改,新增了元素

  • 更新元素
    语法:字典[Key] = Value,结果:字典被修改,元素被更新
    注意:字典Key不可以重复,所以对已存在的Key执行上述操作,就是更新Value值

  • 删除元素
    语法:字典.pop(Key),结果:获得指定Key的Value,同时字典被修改,指定Key的数据被删除

  • 清空字典
    语法:字典.clear(),结果:字典被修改,元素被清空

  • 获取全部的key
    语法:字典.keys(),结果:得到字典中的全部Key

  • 遍历字典
    语法:for key in 字典.keys()

注意:字典不支持下标索引,所以同样不可以用while循环遍历

  • 计算字典内的全部元素(键值对)数量
    语法:len(字典)
    结果:得到一个整数,表示字典内元素(键值对)的数量
# 语法 :字典[key] 可以取到对应的value
stu_soure = {"王力宏":99,"周杰伦":88,"林俊杰":77}
print(stu_soure["王力宏"])   # 结果99
print(stu_soure["周杰伦"])   # 结果88
print(stu_soure["林俊杰"])   # 结果77

# 新增元素
# 	语法:字典[Key] = Value,结果:字典被修改,新增了元素
stu_score = {
    '王力宏': 77,
    '周杰伦': 88,
    '林俊杰': 99,
}
stu_score['张学友'] = 66
print(stu_score)  # 结果 {'王力宏': 77, '周杰伦': 88, '林俊杰': 99, '张学友': 66}

# 更新元素
# 	语法:字典[Key] = Value,结果:字典被修改,元素被更新
# 	注意:字典Key不可以重复,所以对已存在的Key执行上述操作,就是更新Value值
stu_score = {
    '王力宏': 77,
    '周杰伦': 88,
    '林俊杰': 99,
}
stu_score['王力宏'] = 100
print(stu_score)  # 结果 {'王力宏': 100, '周杰伦': 88, '林俊杰': 99}

# 删除元素
# 	语法:字典.pop(Key),结果:获得指定Key的Value,同时字典被修改,指定Key的数据被删除
stu_score = {
    '王力宏': 77,
    '周杰伦': 88,
    '林俊杰': 99,
}
value = stu_score.pop('王力宏')
print(value)      # 结果 77
print(stu_score)  # 结果 {'周杰伦': 88, '林俊杰': 99}

# 清空字典
# 	语法:字典.clear(),结果:字典被修改,元素被清空
stu_score = {
    '王力宏': 77,
    '周杰伦': 88,
    '林俊杰': 99,
}
value = stu_score.clear()
print(stu_score)  # 结果 {}

# 获取全部的key
# 	语法:字典.keys(),结果:得到字典中的全部Key
stu_score = {
    '王力宏': 77,
    '周杰伦': 88,
    '林俊杰': 99,
}
keys = stu_score.keys()
print(keys)  # 结果 dict_keys(['王力宏', '周杰伦', '林俊杰'])

# 遍历字典
# 	语法:for key in 字典.keys()
stu_score = {
    '王力宏': 77,
    '周杰伦': 88,
    '林俊杰': 99,
}
for key in stu_score.keys():
    print(stu_score[key])  # 结果 77 88 99

# 注意:字典不支持下标索引,所以同样不可以用while循环遍历

# 计算字典内的全部元素(键值对)数量
# 	语法:len(字典)
# 	结果:得到一个整数,表示字典内元素(键值对)的数量
stu_score = {
    '王力宏': 77,
    '周杰伦': 88,
    '林俊杰': 99,
}
print(len(stu_score))  # 结果 3

3.字典的嵌套

字典的Key和Value可以是任意数据类型(Key不可为字典)
字典是可以嵌套

需求如下:记录学生各科的考试信息

在这里插入图片描述

stu_score = {'王力宏': {'语文': 77, '数学': 66, '英语': 33, }, '周杰伦': {'语文': 88, '数学': 86, '英语': 55, }, '林俊杰': {'语文': 99, '数学': 96, '英语': 66, }, }

# 优化一下可读性,可以写成:
stu_score = {
    '王力宏': {'语文': 77, '数学': 66, '英语': 33, },
    '周杰伦': {'语文': 88, '数学': 86, '英语': 55, },
    '林俊杰': {'语文': 99, '数学': 96, '英语': 66, },
}

嵌套字典的内容获取

嵌套字典的内容获取,如下所示:

stu_score = {
    '王力宏': {'语文': 77, '数学': 66, '英语': 33, },
    '周杰伦': {'语文': 88, '数学': 86, '英语': 55, },
    '林俊杰': {'语文': 99, '数学': 96, '英语': 66, },
}
print(stu_score['王力宏'])          # 结果  {'语文': 77, '数学': 66, '英语': 33 }
print(stu_score['王力宏']['语文'])  # 结果  77
print(stu_score['周杰伦']['数学'])  # 结果  86

3.字典的特点

经过上述对字典的学习,可以总结出字典有如下特点:

  • 可以容纳多个数据
  • 可以容纳不同类型的数据
  • 每一份数据是KeyValue键值对
  • 可以通过Key获取到Value,Key不可重复(重复会覆盖)
  • 不支持下标索引
  • 可以修改(增加或删除更新元素等)
  • 支持for循环,不支持while循环

4.案例:升职加薪

有如下员工信息,请使用字典完成数据的记录。
并通过for循环,对所有级别为1级的员工,级别上升1级,薪水增加1000元

在这里插入图片描述

运行后,输出如下信息:
在这里插入图片描述

employee_info = {
    '王力宏': {'部门': '科技部', '工资': 3000, '级别': 1},
    '周杰轮': {'部门': '市场部', '工资': 5000, '级别': 2},
    '林俊节': {'部门': '市场部', '工资': 7000, '级别': 3},
    '张学油': {'部门': '科技部', '工资': 4000, '级别': 1},
    '刘德滑': {'部门': '市场部', '工资': 6000, '级别': 2},
}
print(f'全体员工当前信息如下:\n{employee_info}')
for names in employee_info:
    if employee_info[names]['级别'] == 1:
        employee_info[names]['级别'] += 1
        employee_info[names]['工资'] += 1000
print(f'全体员工级别为1的员工完成升职加薪操作,操作后:\n{employee_info}')

八、数据容器的通用操作

1.数据容器对比总结

数据容器可以从以下视角进行简单的分类:

  • 是否支持下标索引

    • 支持:列表、元组、字符串 - 序列类型
    • 不支持:集合、字典 - 非序列类型
  • 是否支持重复元素:

    • 支持:列表、元组、字符串 - 序列类型
    • 不支持:集合、字典 - 非序列类型
  • 是否可以修改

    • 支持:列表、集合、字典
    • 不支持:元组、字符串
      在这里插入图片描述

基于各类数据容器的特点,它们的应用场景如下:

  • 列表:一批数据,可修改、可重复的存储场景
  • 元组:一批数据,不可修改、可重复的存储场景
  • 字符串:一串字符串的存储场景
  • 集合:一批数据,去重存储场景
  • 字典:一批数据,可用Key检索Value的存储场景

2.通用操作

在这里插入图片描述
数据容器的通用操作 - 遍历

  • 5类数据容器都支持for循环遍历
  • 列表、元组、字符串支持while循环,集合、字典不支持(无法下标索引)

数据容器的通用统计功能

  • len(容器) 统计容器的元素个数
  • max(容器) 统计容器的最大元素
  • min(容器) 统计容器的最小元素
# len(容器)
# 统计容器的元素个数
my_list = [1, 2, 3]
my_tuple = (1, 2, 3, 4, 5)
my_str = "itiheima"

print(len(my_list))  # 结果3
print(len(my_tuple))  # 结果5
print(len(my_str))  # 结果8


# max(容器)
# 统计容器的最大元素
my_list = [1, 2, 3]
my_tuple = (1, 2, 3, 4, 5)
my_str = "itiheima"

print(max(my_list))  # 结果3
print(max(my_tuple))  # 结果5
print(max(my_str))  # 结果t

# min(容器)
# 统计容器的最小元素
my_list = [1, 2, 3]
my_tuple = (1, 2, 3, 4, 5)
my_str = "itiheima"

print(min(my_list))  # 结果1
print(min(my_tuple))  # 结果1
print(min(my_str))  # 结果a

数据容器转换功能

  • list(容器) 将给定容器转换为列表
  • str(容器) 将给定容器转换为字符串
  • tuple(容器) 将给定容器转换为元组
  • set(容器) 将给定容器转换为集合
# 数据容器转换功能
my_list = [1, 2, 3, 4, 5]
my_tuple = (1, 2, 3, 4, 5)
my_str = 'abcdefg'
my_set = {1, 2, 3, 4, 5}
my_dict = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5, }
# list(容器)
# 将给定容器转换为列表
print(f'列表转换列表的结果是{list(my_list)}')   # [1, 2, 3, 4, 5]
print(f'元祖转换列表的结果是{list(my_tuple)}')  # [1, 2, 3, 4, 5]
print(f'字符串转换列表的结果是{list(my_str)}')  # ['a', 'b', 'c', 'd', 'e', 'f', 'g']
print(f'集合转换列表的结果是{list(my_set)}')      # [1, 2, 3, 4, 5]
# ['key1', 'key2', 'key3', 'key4', 'key5']
print(f'字典转换列表的结果过是{list(my_dict)}')

# str(容器)
# 将给定容器转换为字符串
print('----------------------')
print(f'列表转换字符串的结果是{str(my_list)}')   # '[1, 2, 3, 4, 5]'
print(f'元祖转换字符串的结果是{str(my_tuple)}')  # '(1, 2, 3, 4, 5)'
print(f'字符串转换字符串的结果是{str(my_str)}')   # 'abcdefg'
print(f'集合转换字符串的结果是{str(my_set)}')    # '{1, 2, 3, 4, 5}'
# '{'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5, }'
print(f'字典转换字符串的结果是{str(my_dict)}')

# tuple(容器)
# 将给定容器转换为元组
print('----------------------')
print(f'列表转换元祖的结果是{tuple(my_list)}')   # (1, 2, 3, 4, 5)
print(f'元祖转换元祖的结果是{tuple(my_tuple)}')  # (1, 2, 3, 4, 5)
print(f'字符串转换元祖的结果是{tuple(my_str)}')   # ('a', 'b', 'c', 'd', 'e', 'f', 'g')
print(f'集合转换元祖的结果是{tuple(my_set)}')    # (1, 2, 3, 4, 5)
# ('key1', 'key2', 'key3', 'key4', 'key5')
print(f'字典转换元祖的结果是{tuple(my_dict)}')

# set(容器)
# 将给定容器转换为集合
print('----------------------')
print(f'列表转换集合的结果是{set(my_list)}')   # {1, 2, 3, 4, 5}
print(f'元祖转换集合的结果是{set(my_tuple)}')  # {1, 2, 3, 4, 5}
print(f'字符串转换集合的结果是{set(my_str)}')   # {1, 2, 3, 4, 5}
print(f'集合转换集合的结果是{set(my_set)}')    # {1, 2, 3, 4, 5}
# {'key1', 'key4', 'key5', 'key2', 'key3'}
print(f'字典转换集合的结果是{set(my_dict)}')

容器排序功能
sorted(容器, [reverse=True])
注意,排序后都会得到列表(list)对象。

# 容器通用排序功能
# sorted(容器, [reverse=True])
# 将给定容器进行排序
# 数据容器转换功能
my_list = [1, 5, 3, 4, 2]
my_tuple = (1, 5, 3, 2, 4)
my_str = 'gbdecfa'
my_set = {1, 5, 2, 4, 3}
my_dict = {'key1': 1, 'key3': 3, 'key4': 4, 'key2': 2, 'key5': 5, }

print(f'列表排序的结果是{sorted(my_list)}')   # [1, 2, 3, 4, 5]
print(f'元祖排序的结果是{sorted(my_tuple)}')  # [1, 2, 3, 4, 5]
print(f'字符排序的结果是{sorted(my_str)}')  # ['a', 'b', 'c', 'd', 'e', 'f', 'g']
print(f'集合排序的结果是{sorted(my_set)}')      # [1, 2, 3, 4, 5]
# ['key1', 'key2', 'key3', 'key4', 'key5']
print(f'字典排序的结果过是{sorted(my_dict)}')

3.字符串比较大小

在程序中,字符串所用的所有字符如:

  • 大小写英文单词
  • 数字
  • 特殊符号(!、\、|、@、#、空格等)

都有其对应的ASCII码表值

每一个字符都能对应上一个:数字的码值
字符串进行比较就是基于数字的码值大小进行比较的。

在这里插入图片描述
字符串是按位比较,也就是一位位进行对比,只要有一位大,那么整体就大。

在这里插入图片描述

在这里插入图片描述

九、综合案例

1 . 幸运数字6:输入任意数字,如数字8,生成nums列表,元素值为1~8,从中选取幸运数字(能够被6整除)移动到新列表lucky,打印nums与lucky。

num = int(input('请输入数字:'))
nums = range(1, num+1)
nums = list(nums)
lucky = []
for i in nums:
    if i % 6 == 0:
        lucky.append(i)
print(f'产生的列表nums为:{nums}\n幸运数字列表lucky为:{lucky}')

2 列表嵌套:有3个教室[[],[],[]],8名讲师[‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,‘G’,‘H’],将8名讲师随机分配到3个教室中

import random

rooms = [[], [], []]
teachers = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

for teacher in teachers:
    index = random.randint(0, 2)
    rooms[index].append(teacher)

print(rooms)

i = 1
for room in rooms:
    print(f'第{i}个教室中的讲师:{room}')
    i += 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ 入门到应用 ( 三 ) 交换机分类

4.交换机 Exchange 分类 4.0.创建队列Queue 在 操作界面 分别 添加 fivemall.goods fivemall.order fivemall.admin yuan.admin 四个队列 4.1.Direct Exchange(直接交换机) 该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中&#xff0c;也就是说路由…

JavaScript JSON

文章目录JavaScript JSON什么是 JSON?JSON 实例JSON 格式化后为 JavaScript 对象JSON 语法规则JSON 数据 - 一个名称对应一个值JSON 对象JSON 数组JSON 数组JSON 字符串转换为 JavaScript 对象相关函数JavaScript JSON JSON 是用于存储和传输数据的格式。 JSON 通常用于服务端…

简单实用的CSS属性(滑轮滚动保持头部不动、暂无数据显示、元素隔开距离、带背景的文字效果、网页上禁止选中文字、校验值有效为绿色无效为红色、)

简单实用的CSS属性&#xff08;滑轮滚动保持头部不动、暂无数据显示、元素隔开距离、带背景的文字效果、网页上禁止选中文字、校验值有效为绿色无效为红色、&#xff09; 目录 一、滑轮滚动保持头部不动 二、暂无数据显示 三、元素隔开距离 四、带背景的文字效果 backgro…

9个相见恨晚的提升办公效率的网站!

推荐9个完全免费的神器网站&#xff0c;每一个都是功能强大&#xff0c;完全免费&#xff0c;良心好用&#xff0c;让你相见恨晚。 1&#xff1a;知犀思维导图 https://www.zhixi.com/ 知犀思维导图是一个完全免费的宝藏在线思维导图工具。它完全免费&#xff0c;界面简洁唯美…

二【单表的增删改查】(只演示增 )

目录1.1 前述1.2 结果映射resultMap1.2.1 字段名和属性名不匹配情况1.2.2 解决方法1.3 使用Insert 方法添加数据&#xff08;涉及主键 问题&#xff09;1.1 前述 MyBatis可以方便的对数据库进行操作&#xff0c;而数据库表可能是一个相对独立的表&#xff08;这里谓之单表&…

2023年1月手机热门品牌型号排行榜(手机行业趋势分析)

近期苹果降价引起人们的关注&#xff0c;并且优惠较大&#xff0c;iPhone 14 Pro系列在苹果官方授权渠道均降价&#xff0c;线下授权门店普遍降价700元左右。iPhone Pro与Pro Max作为苹果的旗舰产品&#xff0c;通常被认为是更为保值的机型&#xff0c;一般来说&#xff0c;不会…

分布式数据库(DorisDB、Clickhouse、TiDB)调研

1. 性能功能特点 B站视频&#xff1a;DorisDB VS ClickHouse OLAP PK 1.1 DorisDB 场量&#xff1a;线上数据应用 访问官方网站DorisDB企业版文档 DorisDB是鼎石科技由Apache Doris核心研发团队打造的新一代企业级MPP数据库。它继承了Apache Doris项目十多年研发成果&…

vr汽修仿真实训教学整体方案软件专业定制

随着网络、多媒体、人机交互等技术的发展,传统的教学模式受到越来越大的挑战.其中,汽车专业教学矛盾较为突出。 传统的汽车专业教学通常采用以PPT、视频、音频等传统视听教学系统的理论教学和实训车间实际操作的实训教学.这种教学模式不仅不能引起学生的学习兴趣,同时需要大量实…

MybatisPlus使用聚合函数

前言 今天遇到了一个求总数返回的情况&#xff0c;我一想这不是用sum就完事了吗。 但是仔细想想&#xff0c;MybatisPlus好像没有直接使用sum的api。 虽然没有直接提供&#xff0c;但是办法还是有的&#xff0c;下面就分享下如何实现的&#xff1a; 首先如果使用sql是这么写…

【计算机网络期末复习】重点知识总复习

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为想复习学校计算机网络课程的同学提供重点大纲&#xff0c;帮助大家渡过期末考~ &#x1f4da;专栏地址&#xff1a;https://blog.csdn.net/newin2020/cate…

tiktok达人带货,快码住!别错过高ROI达人!【超店有数】

众所周知&#xff0c;tiktok的快速发展带火了一大批的达人。这些达人在有了一定的粉丝基础后&#xff0c;通过营销&#xff0c;实现更多的变现。tiktok达人营销符合当下电商市场的发展需求&#xff0c;能够给电商市场带来积极的经济推动。小编建议商家们要善于利用tiktok达人带…

数据库迁移同步工具你选对了吗?

文章目录前言一、Navicat二、DataX二、TurboDX总结前言 之前在项目中&#xff0c;收到一个紧急需求&#xff0c;要把数据从 PostgreSQL 迁移到 TiDB 中。由于时间紧任务重&#xff0c;来不及调研高效的方式&#xff0c;直接使用了 Navicat 内置的功能&#xff0c;把数据从 Pos…

支付宝沙箱环境使用

第一步、开通支付宝开放平台账户 https://open.alipay.com/第二步、选择沙箱环境&#xff0c;按照官方文档操作即可 https://opendocs.alipay.com/common/02kkv7进入沙箱控制台 https://open.alipay.com/develop/sandbox/app第三步、配置接口的加密方式&#xff0c;选择自定义…

Modbus通信协议学习笔记

Modbus主从设备 主控设备&#xff08;Modbus Master&#xff09;&#xff1a;工控机、PLC、触摸屏等等 从设备&#xff08;Modbus Slave&#xff09;&#xff1a;PLC、Modbus采集模块、带485通讯的传感器、仪器仪表等等 Modbus物理接口&#xff1a;串口&#xff08;RS232、RS4…

零信任-深信服零信任aTrust介绍(5)

​深信服零信任aTrust介绍 深信服是国内领先的互联网信任服务提供商&#xff0c;也是国内首家通过认证的全球信任服务商。深信服零信任是其中一项核心的信任技术&#xff0c;主要针对身份认证、数字签名、数字证书等方面的信任问题。 深信服零信任提供了一种新的安全保护模式…

【老王读Spring Transaction-5】Spring事务传播行为propagation behavior的实现原理

Spring事务传播行为propagation behavior的实现原理前言Spring 版本正文事务传播行为(propagation behavior)列举事务传播行为归类事务传播行为的实现原理小结前言 Spring 对事务的封装除了实现了基本的事务管理之外&#xff0c;还提供了事务传播行为(propagation behavior)的…

【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时

【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时 外部定时器 采用定时器做延时使用时 需要计算好分频和计数 另外还要配置为不进行自动重载 对于50MHz的工作频率 分频为50-1也就是50M/501M 一次计数为1us 分频为50000-1也就是1k 一次计数为1ms 我配置的是TIM6 只…

深度学习——自注意力机制和位置编码(笔记)

1.自注意力&#xff1a; ①在深度学习中&#xff0c;经常使用卷积神经网络或者循环神经网络对序列进行编码 ②对于key,value和query&#xff0c;自注意力有一套自己的选法&#xff0c;因为key&#xff0c;value和query的值来自同一组输入。因此被称为自注意力或内部注意力 2…

CDGA|数据治理为什么绕不开数据权责问题?如何确定数据权责?

许多企业在经历过信息化建设之后&#xff0c;自然而然地将数据管理的重任交付给了IT部门&#xff0c;而当企业数据质量产生问题时&#xff0c;高层管理者也往往将其归结为IT部门的责任。然而&#xff0c;企业IT部门真的能够管理好这些数据&#xff0c;使其发挥最大效能吗&#…

在 Kubernetes 上运行《我的世界》

最近给小朋友装上了叨叨许久的 Minecraft&#xff08;我的世界&#xff09;&#xff0c;为了体验安装的是开源启动器 HMCL。其实这游戏我也关注比较久了&#xff0c;不过感觉太耗时间。但被小朋友拉上一起玩&#xff0c;便研究了下自建服务器。GitHub 发现已经有人做好了 Minec…