参考资料:

  1. https://www.jb51.net/article/268491.htm#_lab2_0_2

学习数据容器,就是为了批量存储或批量使用多份数据

数据容器入门

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

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

  • 是否支持重复元素
  • 是否可以修改
  • 是否有序 分为 5 类,分别是: 列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)

list (列表)

列表的定义

基本语法

# 字面量  
[元素1, 元素2, 元素3, 元素4, ...]  
  
# 定义变量  
变量名称 = [元素1, 元素2, 元素3, 元素4, ...]  
  
# 定义空列表  
变量名称 = []  
变量名称 = list()

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

  • [] 作为标识
  • 列表内每个元素之间用 , 隔开

列表可以一次存储多个数据,且可以为不同的数据类型,支持嵌套

列表的下标索引

列表中的每一个元素,都有其位置下标索引,从前向后的方向,从 0 开始,依次递增

image.png

反向索引,从后向前:从 -1 开始,依次递减(-1、-2、-3…)

image.png

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

image.png

列表的常用操作

列表除了可以:

  • 定义
  • 使用下标索引获取值 以外,列表也提供了一系列功能:
  • 插入元素
  • 删除元素
  • 清空列表
  • 修改元素
  • 统计元素个数 等等功能,这些功能我们都称之为:列表的方法

在 Python 中,如果将函数定义为 class(类)的成员,那么函数会称之为:方法

class Student
 
	def add(self, x, y):
		return x + y

方法和函数功能一样, 有传入参数,有返回值,只是方法的使用格式不同:

  • 函数的使用:num = add(1, 2)
  • 方法的使用:
student = Student()
num = student.add(1, 2)
操作作用
列表.append(元素)向列表中追加一个元素
列表.extend(容器)将数据容器的内容依次取出,追加到列表尾部
列表.insert(下标, 元素)在指定下标处,插入指定的元素
del 列表 [下标]删除列表指定下标元素
列表.pop(下标)删除列表指定下标元素
列表.remove(元素)从前向后,删除此元素第一个匹配项
列表.clear()清空列表
列表.count(元素)统计此元素在列表中出现的次数
列表.index(元素)查找指定元素在列表的下标,找不到报错 ValueError
len(列表)统计容器内有多少元素

列表特点

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

列表的遍历

使用循环语句遍历列表

示例代码:

列表的遍历 - while 循环

def while_list():  
    list = [11, 12, 13]  
    index = 0  
    while index < len(list):  
        el = list[index]  
        print(f'元素:{el}')  
  
        index += 1  
  
while_list()

列表的遍历 - for 循环

def for_list():
    list = [1, 2, 3, 4, 5]
    for v in list:
        print(f'元素:{v}')
 
for_list()

练习案例:取出列表内的偶数 定义一个列表,内容是:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 遍历列表,取出列表内的偶数,并存入一个新的列表对象中

list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  
index = 0  
new_list = []  
while index < len(list):  
    if list[index] % 2 == 0:  
        new_list.append(list[index])  
  
    index += 1  
  
for val in list:  
    if val % 2 == 0:  
        new_list.append(val)  
  
print(new_list)

tuple (元组)

元组同列表一样,都是可以封装多个、不同类型的元素在内。 但最大的不同点在于: 元组一旦定义完成就不可修改 注意:即使元组只有一个数据,这个数据后面也要添加逗号

元组相关操作

方法作用
index()查找某个数据,如果数据存在返回对应的下标,否则报错
count()统计某个数据在当前元组出现的次数
len(元组)统计元组内的元素个数

元组的特点

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

str (字符串)

字符串是字符的容器,一个字符串可以存放任意数量的字符。 和其它容器如:列表、元组一样,字符串也可以通过下标进行访问

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

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

所以:

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

字符串常用操作总结

操作说明
字符串 [下标]根据下标索引取出特定位置字符
字符串.index(字符串)查找给定字符的第一个匹配项的下标
字符串.replace(字符串 1, 字符串 2)将字符串内的全部字符串 1,替换为字符串 2
不会修改原字符串,而是得到一个新的
字符串.split(字符串)按照给定字符串,对字符串进行分隔
不会修改原字符串,而是得到一个新的列表
字符串.strip()
字符串.strip(字符串)
移除首尾的空格和换行符或指定字符串
字符串.count(字符串)统计字符串内某字符串的出现次数
len(字符串)统计字符串的字符个数

字符串遍历

str = '小小叮当'
index = 0
while index < len(str):
    print(str[index])
    index += 1
 
 
for v in str:
    print(v)

字符串特点

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

练习案例:分割字符串

my_str = "Welcome to Xi\'an"  
  
# 将字符串内的空格,全部替换为字符:"|"  
new_my_str = my_str.replace(" ", "|")  
print(f"字符串{my_str}被替换空格后,结果是:{new_my_str}")  
# 并按照"|"进行字符串分割,得到列表  
my_str_list = new_my_str.split("|")  
print(f"字符串{new_my_str}按照|分割后结果是:{my_str_list}")

数据容器(序列)的切片

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

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

步长表示,依次取元素的间隔

  • 步长 1 表示,一个个取元素
  • 步长 2 表示,每次跳过 1 个元素取
  • 步长 N 表示,每次跳过 N-1 个元素取 步长为负数表示,反向取(注意,起始下标和结束下标也要反向标记)

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

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

可用方式参考:

  • 倒序字符串,切片取出或切片取出,然后倒序
  • split 分隔 ”,” replace 替换 ” 来 ” 为空,倒序字符串

set (集合)

集合不支持元素的重复(自带去重功能)、并且内容无序

基本语法

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

因为集合是无序的,所以集合不支持:下标索引访问,但允许修改。

集合常用操作总结

操作说明
集合.add(元素)集合内添加一个元素
集合.remove(元素)移除集合内指定的元素
集合.pop()从集合中随机取出一个元素
集合.clear()将集合清空
集合 1.difference(集合 2)得到一个新集合,内含 2 个集合的差集
原有的 2 个集合内容不变
集合 1.difference_update(集合 2)在集合 1 中,删除集合 2 中存在的元素
集合 1 被修改,集合 2 不变
集合 1.union(集合 2)得到 1 个新集合,内含 2 个集合的全部元素
原有的 2 个集合内容不变
len(集合)得到一个整数,记录了集合的元素数量

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

练习:信息去重

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

请:

  • 定义一个空集合
  • 通过 for 循环遍历列表
  • 在 for 循环中将列表的元素添加至集合
  • 最终得到元素去重后的集合对象,并打印输出

dict (字典、映射)

使用字典,实现用 key 取出 value 的操作

基本语法

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

字典数据的获取

  • 使用 [key] 获取 value
  • 字典的内容可嵌套,获取嵌套字典的数据一次写 [key][key]...(获取到第几层写几个)

字典的常用操作总结

操作说明
字典 [Key]获取指定 Key 对应的 Value 值
字典 [Key] = Value添加或更新键值对
字典.pop(Key)取出 Key 对应的 Value 并在字典内删除此 Key 的键值对
字典.clear()清空字典
字典.keys()获取字典的全部 Key,可用于 for 循环遍历字典
len(字典)计算字典内的元素数量

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

不同数据容器特点对比

列表元组字符串集合字典
元素数量支持多个支持多个支持多个支持多个支持多个
元素类型任意任意仅字符任意Key:Value
Key:除字典外任意类型
Value:任意类型
下标索引支持支持支持不支持不支持
重复元素支持支持支持不支持不支持
可修改性支持不支持不支持支持支持
数据有序
使用场景可修改、可重复的一批数据记录场景不可修改、可重复的一批数据记录场景一串字符的记录场景不可重复的数据记录场景以 Key 检索 Value 的数据记录场景

数据容器的通用操作

功能描述
通用 for 循环遍历容器(字典是遍历 key)
max容器内最大元素
min()容器内最小元素
len()容器元素个数
list()转换为列表
tuple()转换为元组
str()转换为字符串
set()转换为集合
sorted(序列, [reverse=True])排序,reverse=True 表示降序
得到一个排好序的列表

拓展 字符串大小比较

  • ASCII 码表
  • 按位比较