当前位置:   article > 正文

Python之数据容器_python数据容器

python数据容器

1. 数据容器入门

数据容器就是一种可以存储多个元素的Python数据类型

Python中的数据容器:

  • list(容器)
  • tuple(元组)
  • str(字符串)
  • set(集合)
  • dict(字典)

它们各有特点,但都满足可容纳多个元素的特性。

2. 列表(list)

2.1 列表的定义语法

列表的定义语法:

[元素,元素,元素,...]

元素:数据容器内的每一份数据,都称之为元素。

元素的数据类型无限制,甚至元素可以是列表,这样就定义了嵌套列表。

2.2 列表的下标索引

列表的每个元素的编号称之为下标索引:

  • 从前向后的方向,编号从0开始递增。
  • 从后向前的方向,编号从-1开始递减。

通过下标索引取出对应位置的元素:

  • 列表[下标]

下标索引的注意事项:

  • 注意下标索引的取值范围,超出范围无法取出元素,并且会报错。
  1. # 定义一个列表
  2. my_list = ['zhangsan','lisi','ydh']
  3. # ['zhangsan', 'lisi', 'ydh']
  4. print(my_list)
  5. # <class 'list'>
  6. print(type(my_list))
  7. my_list = ['zhangsan',666,True]
  8. print(my_list)
  9. print(type(my_list))
  10. # 定义一个嵌套的列表
  11. my_list = [[1,2,3],[4,5,6]]
  12. # 取出嵌套列表中的元素
  13. # 5
  14. print(my_list[1][1])
  15. # 通过索引取数据
  16. my_list = ['tom','rose','jack']
  17. # 从前向后
  18. # tom
  19. print(my_list[0])
  20. # rose
  21. print(my_list[1])
  22. # 从后向前
  23. # jack
  24. print(my_list[-1])
  25. # rose
  26. print(my_list[-2])
  27. # list index out of range
  28. # print(my_list[3])

2.3 列表的常见方法及特点

列表的常见方法:

 列表的特点:

  • 可以容纳多个数据。
  • 可以容纳不同类型的数据。
  • 数据是有序存储的。(有序)
  • 允许重复数据存在。(可重复)
  • 可以修改。(可以增加或删除元素)
  • 支持while循环和for循环。
  1. my_list = ['ydh','yidaihao','python']
  2. # 1.index方法
  3. index = my_list.index('yidaihao')
  4. print(index)
  5. # index = my_list.index('hello')
  6. # # 'hello' is not in list
  7. # print(index)
  8. # 2.修改
  9. my_list[0] = 'zhangsan'
  10. print(my_list)
  11. # 3.insert方法
  12. my_list.insert(1,'lisi')
  13. # ['zhangsan', 'lisi', 'yidaihao', 'python']
  14. print(my_list)
  15. # 4.append方法
  16. my_list.append('best')
  17. # ['zhangsan', 'lisi', 'yidaihao', 'python', 'best']
  18. print(my_list)
  19. # 5.extend方法
  20. my_list2 = [1,2,3]
  21. # ['zhangsan', 'lisi', 'yidaihao', 'python', 'best', 1, 2, 3]
  22. my_list.extend(my_list2)
  23. print(my_list)
  24. # 6.del
  25. my_list = ['ydh','yidaihao','python']
  26. del my_list[2]
  27. print(my_list)
  28. # 7.pop方法
  29. my_list = ['ydh','yidaihao','python']
  30. element = my_list.pop(1)
  31. # yidaihao
  32. print(element)
  33. # ['ydh', 'python']
  34. print(my_list)
  35. # 8.remove方法
  36. my_list = ['ydh','yidaihao','ydh','python']
  37. my_list.remove('ydh')
  38. # ['yidaihao', 'ydh', 'python']
  39. print(my_list)
  40. # 9.clear方法
  41. my_list.clear()
  42. print(my_list)
  43. # 9.count方法
  44. my_list = ['ydh','yidaihao','ydh','python']
  45. count = my_list.count('ydh')
  46. print(count)
  47. # 10.len方法
  48. num = len(my_list)
  49. print(num)

2.4 列表的循环遍历

将容器内的元素依次取出并处理,称之为遍历。使用while循环或者for循环遍历。

  1. list = ['张三丰','黄药师','郭靖','林冲']
  2. # while循环
  3. # i表示列表的下标
  4. i = 0
  5. while i < len(list):
  6. name = list[i]
  7. print('列表的元素:%s' %(name))
  8. i += 1
  9. # for循环
  10. # name表示列表的元素
  11. for name in list:
  12. print(f'列表的元素:{name}')

for循环遍历与while循环遍历的比较:

  • for循环更简单,while循环更灵活。
  • for用于从容器内依次取出元素并处理,while用以任何需要循环的场景。

3. 元组(tuple)

元组的定义方式:

(元素,元素,元素,...)

元组的操作方法:

元组的注意事项:

不可修改内容(可以修改内部list的内部元素)

元组的特点:

  • 可以容纳多个数据。
  • 可以容纳不同类型的数据。
  • 数据是有序存储的。(有序)
  • 允许重复数据存在。(可重复)
  • 不可以修改。(不可以增加或删除元素)
  • 支持while循环和for循环。
  1. # 定义元组
  2. t1 = (1,"hello",True)
  3. t2 = ()
  4. t3 = tuple()
  5. # <class 'tuple'> (1, 'hello', True)
  6. print(type(t1),t1)
  7. # <class 'tuple'> ()
  8. print(type(t2),t2)
  9. # <class 'tuple'> ()
  10. print(type(t3),t3)
  11. # 定义单个元素的元组(要加上逗号)
  12. t4 = ("hello",)
  13. # <class 'tuple'> ('hello',)
  14. print(type(t4),t4)
  15. t5 = ("hello")
  16. # <class 'str'> hello
  17. print(type(t5),t5)
  18. # 元组的嵌套
  19. t6 = ((1,2,3),(4,5,6))
  20. # 下标索引取出内容
  21. num = t6[1][2]
  22. # 6
  23. print(num)
  24. # # 修改元组内容
  25. # # TypeError: 'tuple' object does not support item assignment
  26. # t1[1] = "world"
  27. # 可以修改内部list的内部元素
  28. t7 = (1,2,["ydh","hhh"])
  29. t7[2][1] = "aaa"
  30. # (1, 2, ['ydh', 'aaa'])
  31. print(t7)

4. 字符串(str)

字符串也是数据容器。字符串可以看做是字符的容器,支持下标索引等特性。

字符串的操作方法:

字符串的特点:

  • 只可以存储字符串
  • 长度任意。(取决于内存大小)
  • 支持下标索引。
  • 允许重复字符串存在。
  • 不可以修改。(不可以增加或删除元素)
  • 支持while循环和for循环。
  1. my_str = "itheima and itcast"
  2. # 1.下标索引取值
  3. value = my_str[2]
  4. # h
  5. print(value)
  6. value2 = my_str[-2]
  7. # s
  8. print(value2)
  9. # # TypeError: 'str' object does not support item assignment
  10. # my_str[2] = "H"
  11. # 2.index方法
  12. value = my_str.index("and")
  13. print(value)
  14. # 3.replace方法
  15. new_my_str = my_str.replace("it", "程序")
  16. print(new_my_str)
  17. # 4.split方法
  18. my_str = "hello python itheima itcast"
  19. my_str_list = my_str.split(" ")
  20. # ['hello', 'python', 'itheima', 'itcast']
  21. print(new_my_str)
  22. # 5.strip方法
  23. my_str = " itheima and itcast "
  24. # 不传参
  25. new_my_str = my_str.strip()
  26. # itheima and itcast
  27. print(new_my_str)
  28. my_str = "12itheima and itcast21"
  29. # 传参
  30. new_my_str = my_str.strip("12")
  31. # itheima and itcast
  32. print(new_my_str)
  33. # 6.count方法
  34. my_str = "itheima and itcast"
  35. count = my_str.count("it")
  36. print(count)
  37. # 7.len方法
  38. num = len(my_str)
  39. print(num)

5. 序列和切片

5.1 序列

序列:内容连续、有序、支持下标索引的一类数据容器。列表、元组、字符串都可视为序列。

5.2 切片

  • 序列[起始:结束:步长]
  • 起始可以省略,省略从头开始。
  • 结束可以省略,省略到尾结束。
  • 步长可以省略,省略步长为1(可以为负数,表示倒序执行)。
  1. # 对list进行切片,从1开始,4结束,步长1
  2. my_list = [0,1,2,3,4,5,6]
  3. # 步长为1可以省略
  4. result1 = my_list[1:4]
  5. # [1, 2, 3]
  6. print(result1)
  7. # 对tuple进行切片,从头开始,到最后结束,步长1
  8. my_tuple = (0,1,2,3,4,5,6)
  9. # 起始从头开始和结束到尾结束可以省略,步长为1可以省略
  10. result2 = my_tuple[:]
  11. # (0, 1, 2, 3, 4, 5, 6)
  12. print(result2)
  13. # 对str进行切片,从头开始,到最后结束,步长2
  14. my_str = "0123456"
  15. result3 = my_str[::2]
  16. # 0246
  17. print(result3)
  18. # 对str进行切片,从头开始,到最后结束,步长-1
  19. my_str = "0123456"
  20. result4 = my_str[::-1]
  21. # 6543210 相当于字符串逆序
  22. print(result4)
  23. # 对列表进行切片,从3开始,到1结束,步长-1
  24. my_list = [0,1,2,3,4,5,6]
  25. result5 = my_list[3:1:-1]
  26. # [3, 2]
  27. print(result5)
  28. # 对元组进行切片,从头开始,到尾结束,步长-2
  29. my_tuple = (0,1,2,3,4,5,6)
  30. result6 = my_tuple[::-2]
  31. # (6, 4, 2, 0)
  32. print(result6)

5.3 案例

  1. my_str = "万过薪月,员序程马黑来,nohtyP学"
  2. # 先倒序,后切片
  3. result1 = my_str[::-1][9:14]
  4. print(result1)
  5. # 先切片,后倒序
  6. result2 = my_str[5:10][::-1]
  7. print(result2)
  8. # 先分隔,再替换,最后倒序
  9. result3 = my_str.split(",")[1].replace("来", "")[::-1]
  10. print(result3)

6. 集合(set)

集合的定义方式:

{元素,元素,元素,...}

集合的常用操作:

  1. # 定义集合
  2. my_set = {"传智教育", "黑马程序员", "itheima", "传智教育", "黑马程序员", "itheima", "传智教育", "黑马程序员", "itheima"}
  3. my_set_empty = set()
  4. # <class 'set'> {'itheima', '传智教育', '黑马程序员'} 不重复,无序
  5. print(type(my_set),my_set)
  6. # <class 'set'> set()
  7. print(type(my_set_empty),my_set_empty)
  8. # 添加新元素
  9. my_set.add("Python")
  10. my_set.add("黑马程序员")
  11. # {'传智教育', 'Python', 'itheima', '黑马程序员'}
  12. print(my_set)
  13. # 移除元素
  14. my_set.remove("传智教育")
  15. # {'itheima', 'Python', '黑马程序员'}
  16. print(my_set)
  17. # 随机取出一个元素
  18. my_set = {"传智教育", "黑马程序员", "itheima"}
  19. element = my_set.pop()
  20. # 黑马程序员
  21. print(element)
  22. # 清空集合, clear
  23. my_set.clear()
  24. # set()
  25. print(my_set)
  26. # 取2个集合的差集
  27. set1 = {1, 2, 3}
  28. set2 = {1, 5, 6}
  29. set3 = set1.difference(set2)
  30. # set1-set2={2, 3}
  31. print(f"set1-set2={set3}")
  32. # 消除2个集合的差集
  33. set1 = {1, 2, 3}
  34. set2 = {1, 5, 6}
  35. set1.difference_update(set2)
  36. # {2, 3},{1, 5, 6}
  37. print(f"{set1},{set2}")
  38. # 2个集合合并为1个
  39. set1 = {1, 2, 3}
  40. set2 = {1, 5, 6}
  41. set3 = set1.union(set2)
  42. # {1, 2, 3, 5, 6}
  43. print(set3)
  44. # 统计集合元素数量len()
  45. set1 = {1, 2, 3, 4, 5, 1, 2, 3, 4, 5}
  46. num = len(set1)
  47. # 注意:虽然定义集合时存在重复元素,但是在打印集合或者显示集合中元素个数时会进行去重处理
  48. # 5
  49. print(num)
  50. # 集合的遍历
  51. # 集合不支持下标索引,不能用while循环
  52. # 可以用for循环
  53. set1 = {1, 2, 3, 4, 5}
  54. for element in set1:
  55. print(element)

遍历集合元素:

  • 支持for循环遍历。
  • 不可以使用while循环遍历,因为不支持下标索引。

集合的特点:

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

7.字典(dict)

7.1 字典的定义

字典可以提供基于Key检索Value的场景实现,就像查字典一样。

字典的定义语法:

{key:value,key:value,...,key:value}

  1. # 定义字典
  2. my_dict = {"张三":99,"李四":88,"王五":77}
  3. # 内容:{'张三': 99, '李四': 88, '王五': 77},类型:<class 'dict'>
  4. print(f"内容:{my_dict},类型:{type(my_dict)}")
  5. # 定义空字典
  6. my_dict_empty = {}
  7. my_dict_empty2 = dict()
  8. # 内容:{},类型:<class 'dict'>
  9. print(f"内容:{my_dict_empty},类型:{type(my_dict_empty)}")
  10. # 内容:{},类型:<class 'dict'>
  11. print(f"内容:{my_dict_empty2},类型:{type(my_dict_empty2)}")
  12. # 定义重复Key的字典
  13. my_dict = {"张三":99,"张三":88,"王五":77}
  14. # {'张三': 88, '王五': 77} 字典中出现重复数据时,新数据会覆盖旧数据
  15. print(my_dict)
  16. # 从字典中基于Key获取Value
  17. my_dict = {"张三":99,"李四":88,"王五":77}
  18. score = my_dict["李四"]
  19. # 88
  20. print(score)
  21. # 定义嵌套字典
  22. stu_score_dict = {
  23. "张三":{
  24. "语文": 84,
  25. "数学": 89,
  26. "英语": 96
  27. },"李四":{
  28. "语文": 78,
  29. "数学": 63,
  30. "英语": 85
  31. },"王五":{
  32. "语文": 86,
  33. "数学": 88,
  34. "英语": 100
  35. }
  36. }
  37. # 从嵌套字典中获取数据
  38. # 李四的语文分数
  39. score = stu_score_dict["李四"]["语文"]
  40. # 78
  41. print(score)

注意

  • 键值对的Key和Value可以是任意类型(Key不可为字典)。
  • 字典内Key不允许重复,重复添加等同于覆盖原有数据。
  • 字典不可用下标索引,而是通过Key检索Value。

7.2 字典的操作

  1. my_dict = {"周杰轮": 99, "林俊节": 88, "张学油": 77}
  2. # 新增元素
  3. my_dict["王力鸿"] = 66
  4. # {'周杰轮': 99, '林俊节': 88, '张学油': 77, '王力鸿': 66}
  5. print(my_dict)
  6. # 更新元素
  7. my_dict["周杰轮"] = 60
  8. # {'周杰轮': 60, '林俊节': 88, '张学油': 77, '王力鸿': 66}
  9. print(my_dict)
  10. # 删除元素
  11. score = my_dict.pop("周杰轮")
  12. # {'林俊节': 88, '张学油': 77, '王力鸿': 66},60
  13. print(f"{my_dict},{score}")
  14. # 清空元素, clear
  15. my_dict.clear()
  16. # {}
  17. print(my_dict)
  18. # 获取全部的key
  19. my_dict = {"周杰轮": 99, "林俊节": 88, "张学油": 77}
  20. keys = my_dict.keys()
  21. # dict_keys(['周杰轮', '林俊节', '张学油']) 并非直接的列表
  22. print(keys)
  23. # ['周杰轮', '林俊节', '张学油'] 调用list函数转换为列表形式
  24. print(list(keys))
  25. # 遍历字典
  26. # 方式1:通过获取到全部的key来完成遍历
  27. for key in keys:
  28. print(my_dict[key])
  29. # 方式2:直接对字典进行for循环,每一次循环都是直接得到key
  30. for key in my_dict:
  31. print(my_dict[key])
  32. # 统计字典内的元素数量, len()函数
  33. num = len(my_dict)
  34. # 3
  35. print(num)

注意

  • 新增和更新元素的语法一致,如果Key不存在即新增,如果Key存在即更新(因为Key不可重复)。

字典的特点

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

7.3 字典的案例

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

  1. emp_info_dict = {
  2. "王力鸿":{
  3. "部门":"科技部",
  4. "工资":3000,
  5. "级别":1
  6. },"周杰轮":{
  7. "部门":"市场部",
  8. "工资":5000,
  9. "级别":2
  10. },"林俊节":{
  11. "部门":"市场部",
  12. "工资":7000,
  13. "级别":3
  14. },"张学油":{
  15. "部门":"科技部",
  16. "工资":4000,
  17. "级别":1
  18. },"刘德滑":{
  19. "部门":"市场部",
  20. "工资":6000,
  21. "级别":2
  22. }
  23. }
  24. # for循环遍历字典
  25. for name in emp_info_dict:
  26. if emp_info_dict[name]["级别"] == 1:
  27. # 升值加薪操作
  28. # 获取级别为1的员工的信息(是个字典)
  29. emp_dict = emp_info_dict[name]
  30. # 修改员工的信息
  31. emp_dict["级别"] += 1
  32. emp_dict["工资"] += 1000
  33. # 将员工的信息更新回emp_info_dict
  34. emp_info_dict[name] = emp_dict
  35. print(emp_info_dict)

8. 数据容器对比总结

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

  • 是否支持下标索引(数据是否有序):
    • 支持(是):列表、元组、字符串——序列类型
    • 不支持(否):集合、字典——非序列类型
  • 是否支持重复元素:
    • 支持:列表、元组、字符串——序列类型
    • 不支持:集合、字典——非序列类型
  • 是否可以修改:
    • 支持:列表、集合、字典
    • 不支持:元组、字符串

9. 数据容器的通用操作

字符串如何比较?

从头到尾,一位位进行比较(比较的是字符所对应的ASCII码值),其中一位大,后面就无需比较了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/426078
推荐阅读
相关标签
  

闽ICP备14008679号