python学习之路 - python的数据容器

一、python数据容器

1、数据容器入门

  • 定义:一种可以容纳多份数据的数据类型,容纳的每一份数据称为1个元素,每个元素可以是任意类型的数据,如字符串、数字、布尔等
  • 分类:根据容器特点不同,可以分为列表(list),元组(tuple),字符串(str),集合(set),字典(dict)

2、数列容器:list(列表)

a、列表的定义
#字面量
[元素1,元素2,元素3...]

#定义变量
变量名称 = [元素1,元素2,元素3...]
如:name = ["python",123,True]

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

# 列表的嵌套
变量名称 = [列表1,列表2,列表3...]
如:name = [["java","class"],["python",123],["C语言",True]]
b、列表的下标索引
  • 正向索引
    元素在列表中是有下标索引的,从前到后,从0开始,依次递增
# 取出对应索引中的值
name = ["java","python","C语言"]
print(name[0])		结果:java
print(name[1])		结果:python
print(name[2])		结果:C语言
  • 反向索引
    从后向前,从-1开始,依次递减
# 取出对应索引中的值
name = ["java","python","C语言"]
print(name[-3])		结果:java
print(name[-2])		结果:python
print(name[-1])		结果:C语言
  • 思考:如何获取嵌套列表中的值呢?
# 获取嵌套列表中的第二个小列表的第一个值
name = [["java","class"],["python",123],["C语言",True]]
print(name[1][0])		结果:python
c、列表的常用操作
  • 查询元素下标:列表.index(元素)
# 获取元素python的下标值
name = ["java","python","C语言"]
print(name.index("python"))
  • 修改元素:列表[下标] = 值
# 将列表的第三个元素修改为"C++"
name = ["java","python","C语言"]
name[2] = "C++"
print(name)

结果为:['java', 'python', 'C++']
  • 插入元素:列表.insert(下标,元素)
# 将列表第三个元素前插入新元素"C++"
name = ["java","python","C语言"]
name.insert(2,"C++")
print(name)

结果为:['java', 'python', 'C++', 'C语言']
  • 追加元素:列表.append(元素)
# 列表最后追加新元素"C++"
name = ["java","python","C语言"]
name.append("C++")
print(name)

结果为:['java', 'python', 'C语言', 'C++']
  • 追加一批元素:列表.extent(数据集)
# 将list1后追加list2
list1 = [1,2,3]
list2 = [4,5,6]
list1.extend(list2)
print(list1)

结果为:[1, 2, 3, 4, 5, 6]
  • 删除元素:del 列表[下标] 或者 列表.pop(下标)
# 删除列表第一个元素
list1 = [1,2,3,4,5,6]
del list1[0]		此语法只是删除元素,无法用变量接收内容
print(list1)		结果为:[2, 3, 4, 5, 6]
list1.pop(0)		此语法相当于剪切的效果,可以用变量接收内容
print(list1)		结果为:[3, 4, 5, 6]
  • 删除特定元素的第一个值:列表.remove(元素)
# 删除首次出现的1
list1 = [2,1,3,4,5,1]
list1.remove(1)
print(list1)

结果为:[2, 3, 4, 5, 1]
  • 清空列表:列表.clear()
# 清空列表
list1 = [2,1,3,4,5,1]
list1.clear()
print(list1)

结果为:[]
  • 统计元素个数:列表.count(元素)
# 统计列表中1的个数
list1 = [2,1,3,4,5,1]
print(list1.count(1))

结果为:2
  • 统计列表元素个数:len(列表)
list1 = [1,2,3,4,5,6]
num = len(list1)
print(num)

结果为:6

3、list(列表)的遍历

  • while循环遍历列表
i = 0
list1 = [1,2,3,4,5,6,7,8,9]
while i < len(list1):
    print(list1[i])
    i += 1
  • for循环遍历列表
list1 = [1,2,3,4,5,6,7,8,9]
for i in list1:
    print(i)
  • 案例
    循环列表,取出列表中的偶数并放入新的列表中
# while循环的方式
list1 = [1,2,3,4,5,6,7,8,9,10]
list2 = []
i = 0
while i < len(list1):
    if list1[i] % 2 == 0:
        list2.append(list1[i])
    i += 1

print(list2)
# for循环的方式
list1 = [1,2,3,4,5,6,7,8,9,10]
list2 = []
for i in list1:
    if i % 2 == 0:
        list2.append(i)
print(list2)

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

a、定义格式
# 定义元组字面量
(元素1,元素2,元素3....)
# 定义元组变量
变量名称 = (元素1,元素2,元素3....)
# 定义空元组
变量名称 = ()
变量名称 = tuple()

注意:定义单个元素的元组时,后面需要打逗号
t1 = ("hello")		此时的类型为str
t1 = ("hello",)		此时的类型为tuple

#元组的嵌套
t1 = ((1),(2,3),(4,5)...)
b、特点
  • 元组和列表一样,可以封装多个不同类型的元素
  • 允许重复元素
  • 元组一旦定义完成,则不可修改
  • 特例:如果元组中的元素是一个列表,列表中的元素可以修改
c、常见操作
  • 查找某元素:元组.index(元组值)
#查看元组中2的索引
t1 = (1,2,3,4)
print(t1.index(2))

结果为:1
  • 统计某个数据出现次数:元组.count(元素值)
# 总计元组中1的个数
t1 = (1,2,3,4,1)
print(t1.count(1))

结果为:2
  • 统计元组内元素个数:len(元组)
# 统计元组内的元素个数
t1 = (1,2,3,4)
print(len(t1))

结果为:4
  • while循环遍历元组
t1 = (1,2,3,4)
i = 0
while i < len(t1):
    print(t1[i])
    i += 1
  • for循环编辑元组
t1 = (1,2,3,4)
for i in t1:
    print(i)

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

  • 和其他容易(列表,元组)一样,字符串也是可以通过下标进行访问的
  • 从前向后,下标从0开始增加。从后向前,下标从-1开始减少
  • 字符串本身不能修改,如要修改只能得到一个新的字符串
s1 = 'hello'
print(s1[0])
print(s1[-5])

结果都为:h
  • 字符串的替换:字符串.replace(被替换的字符串,替换为的字符串)
#将字符串中的1替换成2
s1 = '1234561'
s2 = s1.replace('1','2')
print(s2)

结果为:2234562
  • 字符串的分割:字符串.split(分割符字符串)
    得到的是一个列表
#按空格切割字符串
s1 = "hello i am a programmer"
l1 = s1.split(" ")
print(l1)

结果为:['hello', 'i', 'am', 'a', 'programmer']
  • 去掉字符串前后空格:字符串.strip()
#去掉hello前后空格
s1 = " hello "
s2 = s1.strip()
print(s1)
print(s2)

结果为:
 hello 
hello
  • 去掉前后指定字符串:字符串.strip(要去除的字符串)
    注意:只要字符串前后存在要去除的字符串内容,无论顺序如何都能被去除
#去掉hello前后的12
s1 = "12hello21"
s2 = s1.strip("12")
print(s2)

结果为:hello

这里无论s1是"12hello12",还是"12hello21",或者"21hello12",前后的12的内容都能被去除掉
  • 统计字符串中某字符串的出现次数:字符串.count(字符串)
#统计hello字符串中l有几个
s1 = "hello"
print(s1.count("l"))

结果为:2
  • 统计字符串的长度:len(字符串)
#统计hello字符串的长度
s1 = "hello"
print(len(s1))

结果为:5

6、数据容器的切片

a、定义

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

b、语法
  • 语法:序列[起始下标:结束下标:步长]
  • 切片输入内容包含起始下标对应内容,不包含结束下标对应内容
  • 表示序列中,从指定位置开始,依次取出元素,到指定位置结束,得到一个新的序列
  • 步长为1时,表示一个一个取元素。步长为2时,表示跳过1个元素取。步长为负数时,表示反向取,此时的起始下标和结束下标也要反向标记
#对list1进行切片,从1开始,4结束,步长为1
list1 = [0,1,2,3,4,5,6]
list2 = list1[1:4]		步长为1时可省略不写
print(list2)
结果为:[1, 2, 3]

#对tuple1进行切片,从头到尾,步长为1
tuple1 = (0,1,2,3,4,5,6)
tuple2 = tuple1[:]		起始和结束不写表示从头到尾,步长1时可省略
print(tuple2)
结果为:(0, 1, 2, 3, 4, 5, 6)

#对str进行切片,从头到尾,步长为2
str1 = "0123456"
str2 = str1[::2]		起始和结束不写表示从头到尾
print(str2)
结果为:0246

#对list反向切片,从头到尾,步长为-1
list1 = [0,1,2,3,4,5,6]
list2 = list1[::-1]
print(list2)
结果为:[6, 5, 4, 3, 2, 1, 0]

#对tuple反向切片,从61,步长为-2
tuple1 = (0,1,2,3,4,5,6)
tuple2 = tuple1[6:1:-2]
print(tuple2)
结果为:(6, 4, 2)

#对str反向切片,从6开始到尾结束,步长为-2
str1 = "0123456"
str2 = str1[5::-2]
print(str2)
结果为:531

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

a、定义格式
# 定义集合字面量
{元素1,元素2,元素3....}
# 定义集合变量
变量名称 = {元素1,元素2,元素3....}
#定义空集合
变量名称 = set()
b、特点
  • 可以容纳多个不同类型的数据
  • 不支持重复元素,并且内容无序,不支持下标索引获取内容
  • 如果集合中内容有重复,集合会自动去重
c、常见操作
  • 添加新元素:集合.add(元素)
#集合中添加新元素4
set1 = {1,2,3,1,2,3}
set1.add(4)
print(set1)

结果为:{1, 2, 3, 4}		集合会自动去重
  • 移除元素:集合.remove(元素)
#集合移除元素3
set1 = {1,2,3,1,2,3}
set1.remove(3)
print(set1)

结果为:{1, 2}
  • 取出第一个元素:集合.pop()
set1 = {1,2,3}
set1.pop()
print(set1)

结果为:{2, 3}
  • 清空集合:集合.clear()
set1 = {1,2,3}
set1.clear()
print(set1)

结果为:set()
  • 取出集合1有而集合2没有的内容:集合1.difference(集合2)
    获取此内容后,集合1和集合2的原本内容不会改变
    此方法有数据返回,可用变量接收
set1 = {1,2,3}
set2 = {1,5,6}
set3 = set1.difference(set2)
print(set3)

结果为:{2, 3}
  • 在集合1中删除和集合2相同的元素:集合1.difference_update(集合2)
    获取此内容后,集合1被修改,集合2不变
    此方法无数据返回,不能用变量接收
set1 = {1,2,3}
set2 = {1,5,6}
set1.difference_update(set2)
print(set1)

结果为:{2, 3}
  • 两个集合合并为一个:集合1.union(集合2)
    此方法有数据返回,可用变量接收
set1 = {1,2,3}
set2 = {1,5,6}
set3 = set1.union(set2)
print(set3)			结果为自动去重

结果为:{1, 2, 3, 5, 6}
  • 统计集合元素数量:len(集合)
set1 = {1,2,3,1}
print(len(set1))		集合会自动去重

结果为:3
  • 集合的遍历
    因为集合无序,没有下标,所以集合无法用while循环获取下标的方式遍历,只能for循环遍历
set1 = {1,2,3}
for i in set1:
    print(i)

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

a、定义格式
#定义字典字面量
{key:value,key:value....}
#定义字典变量
变量名称 = {key:value,key:value....}
#定义空字典
变量名称 = {}
变量名称 = dict()
  • 定义嵌套字典
姓名语文数学英语
556677
667755
775566
#将上述表格的成绩用字典定义
dict1 = {
	"李":{"语文":55,"数学":66,"英语":77},
	"王":{"语文":66,"数学":77,"英语":55},
	"周":{"语文":77,"数学":55,"英语":66}
	}
b、特点
  • 字典中的key不能重复,不能使用下标索引,而是通过key找对应的value
  • key和value可以是任何数据类型(key不可为字典)
  • 可以for循环遍历,不能用while循环遍历
b、常见操作
  • 获取嵌套字典数据:字典[key值]
# 获取李的语文成绩
dict1 = {
	"李":{"语文":55,"数学":66,"英语":77},
	"王":{"语文":66,"数学":77,"英语":55},
	"周":{"语文":77,"数学":55,"英语":66}
	}
print(dict1["李"]["语文"])
  • 新增 / 修改 元素:字典[key] = value
    如果存在key,则新增,如果不存在key,则修改
#修改李的语文成绩为88
dict1 = {"李":{"语文":55,"数学":66,"英语":77}}
dict1["李"]["语文"] = 88
print(dict1)
结果为:{'李': {'语文': 88, '数学': 66, '英语': 77}}

#为李新增物理成绩88
dict1 = {"李":{"语文":55,"数学":66,"英语":77}}
dict1["李"]["物理"] = 88
print(dict1)
结果为:{'李': {'语文': 55, '数学': 66, '英语': 77, '物理': 88}}
  • 删除元素:字典.pop(key)
#删除李的语文成绩
dict1 = {"李":{"语文":55,"数学":66,"英语":77}}
dict1["李"].pop("语文")
print(dict1)
结果为:{'李': {'数学': 66, '英语': 77}}
  • 清空元素:字典.clear()
dict1 = {"李":{"语文":55,"数学":66,"英语":77}}
dict1.clear()
print(dict1)

结果为:{}
  • 获取全部key:字典.keys()
#获取李中的全部key
dict1 = {"李":{"语文":55,"数学":66,"英语":77}}
keys = dict1["李"].keys()
print(keys)
  • 字典的遍历
# 遍历字典中李的value
#方法一:先获取所有key,在通过key获取value
dict1 = {"语文":55,"数学":66,"英语":77}
keys = dict1.keys()
for i in keys:
    print(dict1[i])

#方法二:直接对字典遍历
dict1 = {"语文":55,"数学":66,"英语":77}
for key in dict1:
    print(dict1[key])
  • 统计字典的元素数量:len(字典)
dict1 = {"语文":55,"数学":66,"英语":77}
print(len(dict1))

结果为:3

9、数据容器的简单对比

  • 是否支持下标索引
    • 支持:列表、元组、字符串
    • 不支持:集合、字典
  • 是否支持重复元素
    • 支持:列表、元组、字符串
    • 不支持:集合、字典
  • 是否支持可以修改
    • 支持:列表、集合、字典
    • 不支持:元组、字符串
  • 数据是否有序
    • 有序:列表、元组、字符串
    • 无序:集合、字典
  • 使用场景
    • 列表:记录可修改、可重复的一批数据
    • 元组:记录不可修改、可重复的一批数据
    • 字符串:记录一串字符
    • 集合:记录不可重复的数据
    • 字典:记录以key检索value的数据

10、数据容器的通用操作

  • 统计容器的元素个数:len(容器)
list1 = [1,2,3,4,5]
str1 = "12345"
tuple1 = (1,2,3,4,5)
set1 = {1,2,3,4,5}
dict1 = {"key1":1,"key2":2,"key3":3,"key4":4,"key5":5}
print(len(list1))
print(len(str1))
print(len(tuple1))
print(len(set1))
print(len(dict1))

结果都为:5
  • 统计容器的最大元素:max(容器)
list1 = [1,2,3,4,5]
str1 = "12345"
tuple1 = (1,2,3,4,5)
set1 = {1,2,3,4,5}
dict1 = {"key1":1,"key2":2,"key3":3,"key4":4,"key5":5}
print(max(list1))
print(max(str1))
print(max(tuple1))
print(max(set1))
print(max(dict1))4个结果为:55个结果为:key5
  • 统计容器的最小元素:min(容器)
list1 = [1,2,3,4,5]
str1 = "12345"
tuple1 = (1,2,3,4,5)
set1 = {1,2,3,4,5}
dict1 = {"key1":1,"key2":2,"key3":3,"key4":4,"key5":5}
print(min(list1))
print(min(str1))
print(min(tuple1))
print(min(set1))
print(min(dict1))4个结果为:15个结果为:key1
  • 容器转列表
list1 = [1,2,3,4,5]
str1 = "12345"
tuple1 = (1,2,3,4,5)
set1 = {1,2,3,4,5}
dict1 = {"key1":1,"key2":2,"key3":3,"key4":4,"key5":5}
print(f"列表转列表结果为:{list(list1)}")
print(f"字符串转列表结果为:{list(str1)}")
print(f"元组转列表结果为:{list(tuple1)}")
print(f"集合转列表结果为:{list(set1)}")
print(f"字典转列表结果为:{list(dict1)}")

结果为:
列表转列表结果为:[1, 2, 3, 4, 5]
字符串转列表结果为:['1', '2', '3', '4', '5']
元组转列表结果为:[1, 2, 3, 4, 5]
集合转列表结果为:[1, 2, 3, 4, 5]
字典转列表结果为:['key1', 'key2', 'key3', 'key4', 'key5']
  • 容器转元组
list1 = [1,2,3,4,5]
str1 = "12345"
tuple1 = (1,2,3,4,5)
set1 = {1,2,3,4,5}
dict1 = {"key1":1,"key2":2,"key3":3,"key4":4,"key5":5}
print(f"列表转元组结果为:{tuple(list1)}")
print(f"字符串转元组结果为:{tuple(str1)}")
print(f"元组转元组结果为:{tuple(tuple1)}")
print(f"集合转元组结果为:{tuple(set1)}")
print(f"字典转元组结果为:{tuple(dict1)}")

结果为:
列表转元组结果为:(1, 2, 3, 4, 5)
字符串转元组结果为:('1', '2', '3', '4', '5')
元组转元组结果为:(1, 2, 3, 4, 5)
集合转元组结果为:(1, 2, 3, 4, 5)
字典转元组结果为:('key1', 'key2', 'key3', 'key4', 'key5')
  • 容器转字符串
list1 = [1,2,3,4,5]
str1 = "12345"
tuple1 = (1,2,3,4,5)
set1 = {1,2,3,4,5}
dict1 = {"key1":1,"key2":2,"key3":3,"key4":4,"key5":5}
print(f"列表转字符串结果为:{str(list1)}")
print(f"字符串转字符串结果为:{str(str1)}")
print(f"元组转字符串结果为:{str(tuple1)}")
print(f"集合转字符串结果为:{str(set1)}")
print(f"字典转字符串结果为:{str(dict1)}")

结果为:
列表转字符串结果为:[1, 2, 3, 4, 5]
字符串转字符串结果为:12345
元组转字符串结果为:(1, 2, 3, 4, 5)
集合转字符串结果为:{1, 2, 3, 4, 5}
字典转字符串结果为:{'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5}

注意:转化为字符串后,内容自动会有双引号,只是打印时会自动将双引号去掉
  • 容器转集合
list1 = [1,2,3,4,5]
str1 = "12345"
tuple1 = (1,2,3,4,5)
set1 = {1,2,3,4,5}
dict1 = {"key1":1,"key2":2,"key3":3,"key4":4,"key5":5}
print(f"列表转集合结果为:{set(list1)}")
print(f"字符串转集合结果为:{set(str1)}")
print(f"元组转集合结果为:{set(tuple1)}")
print(f"集合转集合结果为:{set(set1)}")
print(f"字典转集合结果为:{set(dict1)}")

结果为:
列表转集合结果为:{1, 2, 3, 4, 5}
字符串转集合结果为:{'5', '3', '4', '2', '1'}
元组转集合结果为:{1, 2, 3, 4, 5}
集合转集合结果为:{1, 2, 3, 4, 5}
字典转集合结果为:{'key5', 'key1', 'key3', 'key2', 'key4'}
  • 通用排序:sorted(容器, reverse=True)
    默认为正序排序,添加 reverse=True 则为倒序排序
list1 = [2,4,3,1,5]
str1 = "53214"
tuple1 = (3,2,5,1,4)
set1 = {5,2,1,3,4}
dict1 = {"key2":2,"key5":5,"key3":3,"key1":1,"key4":4}
print(f"列表排序结果为:{sorted(list1, reverse=True)}")
print(f"字符串排序结果为:{sorted(str1, reverse=True)}")
print(f"元组排序结果为:{sorted(tuple1, reverse=True)}")
print(f"集合排序结果为:{sorted(set1, reverse=True)}")
print(f"字典排序结果为:{sorted(dict1, reverse=True)}")

结果为:
列表排序结果为:[5, 4, 3, 2, 1]
字符串排序结果为:['5', '4', '3', '2', '1']
元组排序结果为:[5, 4, 3, 2, 1]
集合排序结果为:[5, 4, 3, 2, 1]
字典排序结果为:['key5', 'key4', 'key3', 'key2', 'key1']
  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值