当前位置:   article > 正文

Python学习笔记--数据容器_python的数据容器综合练习及讲解

python的数据容器综合练习及讲解

文章末尾进行了详细的扩展

(一) 数据容器入门


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

2.. 种类:list(列表)、tuple(元组)、str(字符串)、set(集合)、dict(字典)

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


1. 定义


(1) 基本语法:

# 字面量

[元素1 ,元素2 ,元素3,……]

# 定义变量

变量名称 = [元素1 ,元素2 ,元素3,……]

# 定义空列表

变量名称 = []

变量名称 = list()

(2) 元素:列表中的每个数据

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

2. 列表的下标索引


(1) 类型:正向:从前向后,从0开始,依次递增

                        反向:从后向前,从-1开始,依次递减

(2) 使用:

列表[下标]

 下标超出范围,则无法取出元素,并且会报错

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


* 函数:封装的代码单元,可提供特定功能。

  如将函数定义为class(类)的成员,则称函数为方法。

编号关键字使用方法作用
1index列表.index(元素)查找指定元素在列表中的下标,找不到则报错ValueError
2lenlen(列表)统计容器中有多少元素
3count列表.count(元素)统计此元素在列表中出现的次数
4deldel 列表[下标]删除列表指定的下标元素
5pop列表.pop(下标)删除列表指定的下标元素,不写下标默认最后一个元素
6remove列表.remove(元素)从前向后,删除此元素的第一个匹配项
7append列表.append(元素)向列表中追加一个元素
8extend列表.extend(容器)将数据容器中的内容依次取出,追加到列表尾部
9insert列表.insert(下标,元素)在指定下标处,插入指定的元素
10clear

列表.clear()

清空列表
11.sortlist.sort()对列表中的元素进行排序。
12.reverselist.reverse()倒排列表中的元素。

4. 列表的特点

  • 可容纳多个元素
  • 可容纳不同类型的元素
  • 数据是有序存储的
  • 允许重复数据存在
  • 可进行增删查改.
  1. age = [21, 25, 21, 23, 22, 20]
  2. age.append(31)
  3. print(age)
  4. age.extend([29, 33, 30])
  5. print(age)
  6. x = age[0]
  7. y = age[-1]
  8. print(x, y)
  9. a = age.index(31)
  10. print(a)

练习2:

  1. #
  2. a = [66.25, 333, 333, 1, 1234.5]
  3. print(a.count(333), a.count(66.25), a.count('x'))#统计此元素在列表中出现的次数
  4. #
  5. a.insert(2, -1)#在指定下标处,插入指定的元素
  6. a.append(333)#向列表中追加一个元素
  7. print(a)
  8. #
  9. a.index(333)#返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。
  10. print(a.index(333))
  11. #
  12. a.remove(333)#从前向后,删除此元素的第一个匹配项
  13. print(a)
  14. #
  15. a.reverse() #倒排列表中的元素。
  16. print(a)
  17. #
  18. a.sort()#对列表中的元素进行排序。
  19. print(a)

(三) list(列表)的遍历

遍历:将容器内的元素依次取出,并处理

1.  使用while遍历

     可以指定循环条件,自行控制
     可以通过条件控制做到无限循环
     适用于任何想要循环的场景


2. 使用for遍历


     不可以指定循环条件,只可以一个个从容器内取出数据
     理论上不可以无限循环,因为被遍历的容器容量不是无限的
     适用于遍历数据容器的场景或简单的固定次数循环场景
练习:

  1. L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  2. l1 = list()
  3. l2 = list()
  4. i = 0
  5. # 取出偶数
  6. while i < len(L):
  7. if L[i] % 2 == 0:
  8. l1 . append(L[i])
  9. i = i + 1
  10. else:
  11. i = i + 1
  12. print(f"通过while循环,从列表:{L},中取出偶数,组成新列表{l1}")
  13. for j in L:
  14. if j % 2 == 0:
  15. l2 . append(j)
  16. print(f"通过for循环,从列表:{L},中取出偶数,组成新列表{l2}")

(四) 数据容器:tuple(元组)

* 元组一旦定义,不可进行修改

1. 元组的定义


(1) 基本语法:

# 字面量

(元素1 ,元素2 ,元素3,……)

# 定义变量

变量名称 =(元素1 ,元素2 ,元素3,……)

# 定义空列表

变量名称 = ()

变量名称 =tuple()

 元组即使只含有一个数据,这个数据后也要添加,也可进行嵌套

2. 元组的操作(方法) 
 

编号关键字使用方法作用
1indexindex()查找指定数据在元组中的下标,找不到则报错
2lenlen(元组)统计元组内有多少元素
3countcount()

统计某个数据在元组中出现的次数

! 不可修改元组内容,否则直接报错

! 可修改元组内list的内容

! 不可以替换元组内list为其他list或其他类型

3. 元组的特点

  • 可容纳多个元素
  • 可容纳不同类型的元素
  • 数据是有序存储的
  • 允许重复数据存在
  • 可进行增删查改
  • 可进行循环
  • 不可修改

练习:

  1. T = ('周杰伦', 11, ['football', 'music'])
  2. a = T.index(11)
  3. n = T[0]
  4. print(a,n)
  5. del T[2][0]
  6. T[2].append('coding')
  7. print(T)

(五) 数据容器:str(字符串)


1. 字符串


字符的容器,一个字符串可以存放任意数量的字符。

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


从前向后,下标从0开始
从后向前,下标从-1开始
! 字符串是一个无法修改的数据容器

! 如果要修改,则会得到一个新的字符串,旧的字符串是无法修改的

3. 字符串的常用操作

编号关键字使用方法作用
1字符串[下标]根据下标索引取出特定位置字符
2index字符串.index(字符串)查找给定字符的第一个匹配项的下标
3replace字符串.replace(字符串1,字符串2)

将字符串内的全部字符串1,替换为字符串2

!不会改变原字符串,而是得到一个新的字符串

4split字符串.split(字符串)

按照给定字符串,对字符串进行分割

!不会改变原字符串,而是得到一个新的列表

5strip

字符串.strip()

字符串.strip(字符串)

移除首尾的空格和换行符或指定字符串
6

count

字符串.count(字符串)统计字符串内某字符串的出现次数
7lenlen(字符串)统计字符串的字符个数

4. 字符串的特点

  • 只可以存储字符串
  • 长度任意
  • 支持下标索引
  • 允许重复的字符串出现
  • 不可以修改
  • 支持循环

练习:

  1. S = "itheima itcast boxuegu"
  2. n = S.count("it")
  3. print(f"字符串{S}中有{n}个it字符")
  4. S1 = S.replace(" ", "|")
  5. print(f"字符串{S},被替换空格后,结果{S1}")
  6. L = S1.split("|")
  7. print(f"字符串{S},按照“|”分割后,得到{L}")

(七) 数据容器:set(集合)


1. 集合的基本语法


# 定义集合字面量

(元素,元素,……,元素)

# 定义集合变量

变量名称 = {元素,元素,……,元素}

# 定义空集合

变量名称 = set()

! 去重且无序,无法保证顺序与创建的时候一致

! 不支持:下标索引访问,因此不支持while循环

补充:

定义:

列表[]         可修改、支持重复元素且有序

元组()    不可修改、支持重复元素且有序

字符串“”     不可修改、支持重复元素且有序

集合{}         可修改、不支持重复元素、无序

2. 集合的常用功能
 

编号关键字使用方法作用
1add集合.add(元素)集合内添加一个元素
2remove集合.remove(元素)移除集合内指定的元素
3pop集合.pop()从集合中随机取出一个元素
4clear集合.clear()将集合清空
5difference集合1.difference(集合2)

得到一个新集合,内含2个集合的差集

原有的2个集合内容不变

6update集合1.difference_update(集合2)

在集合1中,删除集合2中存在的元素

集合1被修改,集合2不变

7union集合1.union(集合2)得到1个新集合,内含2个集合的全部元素原有的2个集合内容不变
8lenlen(集合)得到一个整数,记录了集合的元素数量

3. 集合的特点

  • 可以容纳多个数据
  • 可以容纳不同类型的数据(混装)
  • 数据是无序存储的(不支持下标存储)
  • 不允许重复数据存在
  • 可以修改
  • 支持for循环,不支持while循环

练习:

  1. my_list = ['黑马程序员','传智播客','黑马程序员','传智播客','itheima','itcast','itheima','itcast','best']
  2. S = set()
  3. for i in my_list:
  4. S.add(i)
  5. print(f"有列表:{my_list}")
  6. print(f"存入集合后结果:{S}")

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


1. 字典的基本语法


# 定义字典字面量

{key:value,key:value,……,key:value}

# 定义字面变量

my_dict = {key:value,key:value,……,key:value}

# 定义空字典

my_dict = {}

my_dict = dict{}

! 每个元素均为键值对,key和value可以为任意类型数据(key不可为字典)

! key不可重复,重复会对原有数据覆盖

! 不可以使用下标索引,但可通过key值取得对应的value,不可使用while循环

! 字典可嵌套

2. 字典的常用操作
 

编号关键字使用方法作用
1字典[Key]获取指定Key对应的Value值
2字典[Key] = Value添加或更新键值对
3pop字典.pop(Key)取出Key对应的Value并在字典内删除此Key的键值对
4clear字典.clear()清空字典
5keys字典.keys()获取字典的全部Key,可用于for循环遍历字典
6lenlen(字典)计算字典内的元素数量

3. 字典的特点

  • 可以容纳多个数据
  • 可以容纳不同类型的数据(混装)
  • 不支持下标索引
  • 可以修改
  • 支持for循环,不支持while循环

练习:

  1. D = {
  2. "王力鸿":{"部门":"科技部","工资":3000,"级别":1},
  3. "周婕纶":{"部门":"市场部","工资":5000,"级别":2},
  4. "凌俊杰":{"部门":"市场部","工资":7000,"级别":3},
  5. "张雪有":{"部门":"科技部","工资":4000,"级别":1},
  6. "牛德华":{"部门":"市场部","工资":6000,"级别":2}
  7. }
  8. keys = D.keys()
  9. print(D)
  10. for key in keys:
  11. if D[key]["级别"] == 1:
  12. D[key]["工资"] = D[key]["工资"] + 1000
  13. print(D)

 扩展:数据容器的对比总结

列表元组字符串集合字典
元素数量支持多个支持多个支持多个支持多个支持多个
元素类型任意任意仅字符任意

Key:除字典外任意类型

Value:任意类型

下标索引××
重复元素××
可修改性××
数据有序×××
使用场景可修改、可重复的一批数据的记录不可修改、可重复的一批数据的记录一串字符的记录不可重复的数据记录以Key检索Value的数据记录

(九) 数据容器的通用操作

序号功能描述
1for循环遍历容器(字典是遍历key)
2max()容器内最大元素
3min()容器内最小元素
4len()容器内元素个数
5list()转换为列表
6tuple()转换为元组
7str()转换为字符串
8set()转换为集合
9sorted(序列,[reverse = True])

排序,得到一个排好序的列表

reverse = True表示“降序”

(十)综合案例

练习题1:

  1. # 幸运数字6:
  2. # 1. 输入任意数字,如数字8,生成nums列表,元素值为1-8,
  3. # 2. 从中选取幸运数字(能被6整除)移动到新列表lucky
  4. # 3. 打印nums和lucky
  5. n = int(input("请输入您所想的数字:"))
  6. i = 1
  7. j = 0
  8. nums = list()
  9. lucky = list()
  10. print(n)
  11. while i <= n:
  12. nums.append(i)
  13. i = i + 1
  14. print(f"nums列表为:{nums}")
  15. for j in nums:
  16. if j % 6 == 0:
  17. lucky.append(j)
  18. j = j + 1
  19. print(f"lucky列表为:{lucky}")

结果1:

结果2: 

 练习题2:

  1. # 列表嵌套:
  2. # 3个教室[[],[],[]]
  3. # 8名讲师['A','B','C','D','E','F','G','H']
  4. # 随机分配
  5. import random
  6. classroom = [[],[],[]]
  7. teacher = ['A','B','C','D','E','F','G','H']
  8. j = random.randint(0,2)
  9. for i in teacher:
  10. classroom[j].append(i)
  11. j = random.randint(0,2)
  12. print(f"分配后为:{classroom}")

一、基础知识

可变序列:目前包括字典、列表

不可变序列:目前包括整数,字符串

区别在于可变序列可以进行增、删、查、改操作,而不可变序列不可以进行

二、 字典的组成及原理

字典是由键值对组成的,字典是无序的排列方式,他不是根据你输入键的前后顺序来存储他,而是根据键的哈希值来存储

也是由于这个原因,字典的键必须是一个不可变序列,而且键不可以重复

语法格式如此:字典名={键:值,键:值,…}

字典的实现原理:

他是先由哈希函数计算键从而得到不同键的索引,然后根据键的索引排序键,键中保存的是值的地址,从而达到引用键而找到值的效果

字典特点:

1.字典中键值对是一一对应的,其中,键是不可以重复的,而值是可以重复的

2.字典中的键值对是无序的

3.字典是一种用空间换时间的数据结构

4.字典的键必须是不可变对象

三、字典的创建方式

字典的创建方式总共有两种:

1.通过{}创建字典
  1. score={'tom':85,'jack':92,'sam':'pass'}
  2. print(score) #输出{'tom': 85, 'jack': 92, 'sam': 'pass'}
  3. print(type(score)) #输出<class 'dict'>
2.通过内置函数dict()创建字典

在()里面写入键值对,与{}不同的是,这种创建方式为键=值,而不是键:值,这点需要注意

  1. student=dict(tom=85,jack=92,sam='pass')
  2. print(student)                      #输出{'tom': 85, 'jack': 92, 'sam': 'pass'}
  3. print(type(student))
3.创建一个空列表
  1. empty={}                            #输出{}
  2. print(empty)
  3. empty1=dict()
  4. print(empty1)

四、字典元素的获取

字典元素的获取有两种方法:

1.使用[]获取,[]里面是键值
  1. print(score['tom']) #输出58
  2. #print(score['alice']) #如果查找不到,就会报错:KeyError: 'alice'
2.使用get()方法获取
  1. score={'tom':58,'linda':62,'jack':98}
  2. print(score.get('tom')) #输出58
  3. print(score.get('alice')) #如果查找不到就会输出:None,这个none是可以代替的,在键后面加入替代的值,找不到就会输出替代的值
  4. print(score.get('alice',56)) #输出56,如果查找不到就会默认输出键后面的值

五、字典元素的增删改操作

5.1字典元素的修改
  1. dict={'tom':56,'jack':59,'marry':53,'刘桂香':77}
  2. print(dict) #输出{'tom': 56, 'jack': 59, 'marry': 53, '刘桂香': 77}
  3. dict['tom']=100
  4. print(dict) #输出{'tom': 100, 'jack': 59, 'marry': 53, '刘桂香': 77}
5.2 字典元素的删除:
  1. dict={'tom':56,'jack':59,'marry':53,'刘桂香':77}
  2. print(dict) #输出{'tom': 56, 'jack': 59, 'marry': 53, '刘桂香': 77}
  3. del dict['tom'] #删除会删除整个键值对
  4. print(dict) #输出{'jack': 59, 'marry': 53, '刘桂香': 77}
5.3 字典元素的增加
  1. dict={'tom':56,'jack':59,'marry':53,'刘桂香':77}
  2. print(dict)
  3. dict['alice']=5666
  4. print(dict) #输出{'tom': 56, 'jack': 59, 'marry': 53, '刘桂香': 77, 'alice': 5666}
5.4 字典元素的清空
  1. dict={'tom':56,'jack':59,'marry':53,'刘桂香':77}
  2. print(dict) #输出{'tom': 56, 'jack': 59, 'marry': 53, '刘桂香': 77}
  3. dict.clear()
  4. print(dict) #输出{}

六、获取字典视图

实际上就是获取字典里面所有的键,所有的值,以及所有的键值对

这三种东西的获取方法各有不同,虽然方法各不一样,但是操作原理,用法都是一样的

6.1 获取所有的键

keys()函数

  1. score={'tom':58,'linda':62,'jack':98}
  2. a=score.keys()
  3. print(a) #输出dict_keys(['tom', 'linda', 'jack'])
  4. #可以将输出的键进行列表化,获得键的列表
  5. print(list(a)) #输出['tom', 'linda', 'jack']
6.2 获取所有的值

values()函数

  1. score={'tom':58,'linda':62,'jack':98}
  2. b=score.values()
  3. print(b) # 输出dict_values([58, 62, 98])
  4. print(list(b)) #输出[58, 62, 98]
6.3 获取所有的键值对

items()函数

  1. score={'tom':58,'linda':62,'jack':98}
  2. print(score.items()) #输出dict_items([('tom', 58), ('linda', 62), ('jack', 98)])
  3. print(list(score.items())) #输出[('tom', 58), ('linda', 62), ('jack', 98)]

七、字典元素的遍历

使用for in循环进行遍历
  1. score={'tom':58,'linda':62,'jack':98}
  2. for i in score: #这里的i表示的是键,如果要获取字典的值,就需要使用[]获取或者get函数获取
  3. print(i,score[i],score.get(i))

八、字典生成式

实际上和列表生成式差不太多,多使用了一个内置函数zip,而且由于字典是由键值对组成的,所以需要两个可迭代对象

zip函数组成字典生成式里面,如果键的个数和值得个数不相同时,以小的为准

  1. items=['books','fruits','papers']
  2. prices=[98,56,233]
  3. a={i:j for i,j in zip(items,prices)}
  4. print(a)
  5. prices1=[978,5,5,6451,1] #当键和值的个数不一样的时候,以短的为准
  6. b={m:n for m,n in zip(items,prices1)}
  7. print(b)

九、元组

9.1 什么是元组?
9.2 元组的创建 
9.3 如果元组中只有一个元素,逗号不能省 
  1. t1=('python','world',23)
  2. print(t1)
  3. print(id(t1))
  4. print(type(t1))
  5. # ('python', 'world', 23)
  6. # 1882095097664
  7. # <class 'tuple'>
  8. t2=tuple(('python','world',25))
  9. print(t2)
  10. print(id(t2))
  11. print(type(t2))
  12. # ('python', 'world', 25)
  13. # 1882095097856
  14. # <class 'tuple'>
  15. t3='python','world',23
  16. print(t3)
  17. print(id(t3))
  18. print(type(t3))
  19. # ('python', 'world', 23)
  20. # 1882095097664
  21. # <class 'tuple'>
  22. t=('python',)
  23. print(t)
  24. print(type(t))
  25. # ('python',)
  26. # <class 'tuple'>
  27. t=('python')
  28. print(t)
  29. print(type(t))
  30. # python
  31. # <class 'str'>
  32. #空元组创建方式
  33. t=()
  34. t1=tuple()
9.4 为什么元组是不可变序列
  1. t=(10,[20,30],9)
  2. print(t)
  3. # t[1]=100 TypeError: 'tuple' object does not support item assignment
  4. t[1].append(100)
  5. print(t)
  6. # (10, [20, 30], 9)
  7. # (10, [20, 30, 100], 9)
 9.5 元组的遍历

  1. t=tuple(('python','world',25))
  2. #使用索引获取元组,容易越界
  3. print(t[0])
  4. print(t[1])
  5. print(t[2])
  6. #遍历元组获取元组,不需要知道元祖个数
  7. for item in t:
  8. print(item)

十、集合

什么是集合

 集合的创建

 集合中元素不允许重复;集合中元素无序

  1. s={23,25,43,32,23,123,43,34,23}
  2. print(s)
  3. print(type(s))
  4. # {32, 34, 23, 123, 25, 43}
  5. # <class 'set'>
  6. s=set(range(6))
  7. print(s,type(s))
  8. # {0, 1, 2, 3, 4, 5} <class 'set'>
  9. print(set([3,4,5,6,5]))
  10. # {3, 4, 5, 6}列表转集合
  11. print(set((3,4,5,3,2,34,3,32,2)))
  12. # {32, 34, 2, 3, 4, 5}元组转集合,集合中元素无序
  13. print(set('PYTHON'))
  14. # {'Y', 'H', 'P', 'O', 'N', 'T'} 字符串序列转集合
  15. print(set({1,2,3,4,2,3,4,5,124}))
  16. {1, 2, 3, 4, 5, 124}
  17. #不能用花括号定义空集合
  18. print(type({}),{})
  19. print(type(set()),set())
  20. # <class 'dict'> {}
  21. # <class 'set'> set()
集合的相关操作

  1. s={10,20,30,40,50}
  2. print(10 in s)
  3. print(100 in s)
  4. s.add(100)
  5. print(s)
  6. s.update({200,400,300})
  7. print(s)
  8. s.update([500,600])
  9. print(s)
  10. s.update((700,800))
  11. print(s)
  12. # {50, 20, 100, 40, 10, 30}
  13. # {100, 40, 200, 10, 300, 400, 50, 20, 30}
  14. # {100, 40, 200, 10, 300, 400, 50, 20, 500, 600, 30}
  15. # {800, 100, 40, 200, 10, 300, 400, 50, 20, 500, 600, 700, 30}
  16. s.remove(100)
  17. print(s)
  18. # s.remove(900) KeyError: 900
  19. s.discard(900)
  20. print(s)
  21. s.pop()
  22. print(s)
  23. # s.pop(400) TypeError: set.pop() takes no arguments (1 given) 函数pop()
  24. # {800, 40, 200, 10, 300, 400, 50, 20, 500, 600, 700, 30}
  25. # {800, 40, 200, 10, 300, 400, 50, 20, 500, 600, 700, 30}
  26. # {40, 200, 10, 300, 400, 50, 20, 500, 600, 700, 30}
  27. s.clear()
  28. print(s)
  29. # set()

 集合间的关系

  1. s={10,20,30,40}
  2. s1={20,10,40,30}
  3. print(s1==s)
  4. #True
  5. s2={10,30}
  6. s3={30,50}
  7. print(s2.issubset(s))
  8. print(s3.issubset(s))
  9. # True
  10. # False
  11. print(s.issuperset(s2))
  12. print(s.issuperset(s3))
  13. # True
  14. # False
  15. s4={60,70,80}
  16. print(s.isdisjoint(s1))
  17. print(s.isdisjoint(s2))
  18. print(s.isdisjoint(s4))
  19. # False
  20. # False
  21. # True

 集合的数据操作

  1. #交集:intersection() 或 &
  2. s1={10,20,30}
  3. s2={23,30,20}
  4. print(s1.intersection(s2))
  5. print(s1 & s2)
  6. # {20, 30}
  7. # {20, 30}
  8. #并集:union() 或 |
  9. print(s1.union(s2))
  10. print(s1 | s2)
  11. # {20, 23, 10, 30}
  12. # {20, 23, 10, 30}
  13. #差集:difference() 或 -
  14. s1={10,20,30,40}
  15. s2={20,30,50}
  16. print(s1.difference(s2))
  17. print(s1-s2)
  18. # {40, 10}
  19. # {40, 10}
  20. #对称差集:symmetric_difference() 或 ^
  21. s1={10,20,30,40}
  22. s2={20,30,50}
  23. print(s1.symmetric_difference(s2))
  24. print(s1 ^ s2)
  25. # {40, 10, 50}
  26. # {40, 10, 50}

集合生成式 

  1. #列表生成式
  2. lst=[i*i for i in range(6)]
  3. print(lst,type(lst))
  4. #集合生成式
  5. s={i for i in range(6)}
  6. print(s,type(s))
  7. # [0, 1, 4, 9, 16, 25] <class 'list'>
  8. # {0, 1, 2, 3, 4, 5} <class 'set'>

列表、字典、元组、集合总结 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/426081?site
推荐阅读
相关标签
  

闽ICP备14008679号