写点什么

Python 基础(三) | Python 的组合数据类型

作者:timerring
  • 2022 年 9 月 13 日
    山东
  • 本文字数:5784 字

    阅读完需:约 19 分钟

第三章 组合数据类型

⭐本专栏旨在对 Python 的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握 python 编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实的基础。

🔥本文已收录于 Python 基础系列专栏: Python基础系列教程 免费订阅,持续更新。


3.1 列表

3.1.1 列表的表达

  • 序列类型:内部元素有位置关系,能通过位置序号访问其中元素

  • 列表是一个可以使用多种类型元素,支持元素的增、删、查、改操作的序列类型


ls = ["Python", 1989, True, {"version": 3.7}]ls
复制代码


['Python', 1989, True, {'version': 3.7}]
复制代码


  • 另一种产生方式:list(可迭代对象)

  • 可迭代对象包括:字符串、元组、集合、range()等


字符串转列表


list("欢迎订阅本专栏")
复制代码


['欢', '迎', '订', '阅', '本', '专', '栏']
复制代码


元组转列表


list(("我", "们", "很", "像"))
复制代码


['我', '们', '很', '像']
复制代码


集合转列表


list({"李雷", "韩梅梅", "Jim", "Green"})
复制代码


['Green', 'Jim', '李雷', '韩梅梅']
复制代码


特殊的 range()


for i in [0, 1, 2, 3, 4, 5]:    print(i)
复制代码


012345
复制代码


for i in range(6):    print(i)
复制代码


012345
复制代码


  • range(起始数字,中止数字,数字间隔)


如果起始数字缺省,默认为 0


必须包含中止数字,但是注意中止的数字取不到


数字间隔缺省,默认为 1


for i in range(1, 11, 2):    print(i)
复制代码


13579
复制代码


  • range()转列表


list(range(1, 11, 2))
复制代码


[1, 3, 5, 7, 9]
复制代码

3.1.2 列表的性质

  • 列表的长度——len(列表)


ls = [1, 2, 3, 4, 5]len(ls)
复制代码


5
复制代码


  • 列表的索引——与同为序列类型的字符串完全相同


变量名[位置编号]


正向索引从 0 开始


反向索引从-1 开始


cars = ["BYD", "BMW", "AUDI", "TOYOTA"]
复制代码


print(cars[0])print(cars[-4])
复制代码


BYDBYD
复制代码


  • 列表的切片


变量名[开始位置:结束位置:切片间隔]


cars = ["BYD", "BMW", "AUDI", "TOYOTA"]
复制代码


  • 正向切片


print(cars[:3])     # 前三个元素,开始位置缺省,默认为0;切片间隔缺省,默认为1
复制代码


['BYD', 'BMW', 'AUDI']
复制代码


print(cars[1:4:2])  # 第二个到第四个元素 前后索引差为2
复制代码


['BMW', 'TOYOTA']
复制代码


print(cars[:])      # 获取整个列表,结束位置缺省,默认取值到最后
复制代码


['BYD', 'BMW', 'AUDI', 'TOYOTA']
复制代码


print(cars[-4:-2])  # 获取前两个元素
复制代码


['BYD', 'BMW']
复制代码


  • 反向切片


cars = ["BYD", "BMW", "AUDI", "TOYOTA"]
复制代码


print(cars[:-4:-1])      # 开始位置缺省,默认为-1print(cars[::-1])        # 获得反向列表
复制代码


['TOYOTA', 'AUDI', 'BMW']['TOYOTA', 'AUDI', 'BMW', 'BYD']
复制代码

3.1.3 列表的操作符

  • 用** list1+lis2 **的形式实现列表的拼接


a = [1, 2]b = [3, 4]a+b            # 该用法用的不多
复制代码


[1, 2, 3, 4]
复制代码


  • 用 n*list 或 list*n 实现列表的成倍复制


初始化列表的一种方式


[0]*10
复制代码


[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
复制代码

3.1.4 列表的操作方法

1、增加元素


  • 在末尾增加元素——列表.append(待增元素)


languages = ["Python", "C++", "R"]
复制代码


languages.append("Java")languages
复制代码


['Python', 'C++', 'R', 'Java']
复制代码


  • 在任意位置插入元素——列表.insert(位置编号,待增元素)

  • 在位置编号相应元素插入待增元素


languages.insert(1, "C")languages
复制代码


['Python', 'C', 'C++', 'R', 'Java']
复制代码


  • 在末尾整体并入另一列表——列表 1.extend(列表 2)


append 将列表 2 整体作为一个元素添加到列表 1 中


languages.append(["Ruby", "PHP"])languages
复制代码


['Python', 'C', 'C++', 'R', 'Java', ['Ruby', 'PHP']]
复制代码


extend 将待列表 2 内的元素逐个添加到列表 1 中,当然也可以采用加法实现。


languages = ['Python', 'C', 'C++', 'R', 'Java']languages.extend(["Ruby", "PHP"])languages
复制代码


['Python', 'C', 'C++', 'R', 'Java', 'Ruby', 'PHP']
复制代码


2、删除元素


  • 删除列表 i 位置的元素  列表.pop(位置)


languages = ['Python', 'C', 'C++', 'R', 'Java']languages.pop(1)languages
复制代码


['Python', 'C++', 'R', 'Java']
复制代码


  • 不写位置信息,默认删除最后一个元素


languages.pop()languages
复制代码


['Python', 'C++', 'R']
复制代码


  • 删除列表中的第一次出现的待删元素 列表.remove(待删元素)


languages = ['Python', 'C', 'R', 'C', 'Java']languages.remove("C")    languages
复制代码


['Python', 'R', 'C', 'Java']
复制代码


languages = ['Python', 'C', 'R', 'C', 'Java']while "C" in languages:    languages.remove("C")    languages   
复制代码


['Python', 'R', 'Java']
复制代码


3、查找元素


  • 列表中第一次出现待查元素的位置 列表.index(待查元素)


languages = ['Python', 'C', 'R','Java']idx = languages.index("R") idx
复制代码


2
复制代码


4、修改元素


  • 通过"先索引后赋值"的方式,对元素进行修改 列表名[位置]=新值


languages = ['Python', 'C', 'R','Java']languages[1] = "C++"languages
复制代码


['Python', 'C++', 'R', 'Java']
复制代码


5、列表的复制


  • 错误的方式:这种方式仅是相当于给列表起了一个别名


languages = ['Python', 'C', 'R','Java']languages_2 = languagesprint(languages_2)
复制代码


['Python', 'C', 'R', 'Java']
复制代码


languages.pop()print(languages)print(languages_2)
复制代码


['Python', 'C', 'R']['Python', 'C', 'R']
复制代码


  • 正确的方式——浅拷贝


当内容中也有列表这种可变的情况时,这时浅拷贝可能出问题,应该采用深拷贝。


  • 方法 1:列表.copy()


languages = ['Python', 'C', 'R','Java']languages_2 = languages.copy()languages.pop()print(languages)print(languages_2)
复制代码


['Python', 'C', 'R']['Python', 'C', 'R', 'Java']
复制代码


  • 方法 2:列表 [ : ]

  • 相当于对整个列表的切片


languages = ['Python', 'C', 'R','Java']languages_3 = languages[:]languages.pop()print(languages)print(languages_3)
复制代码


['Python', 'C', 'R']['Python', 'C', 'R', 'Java']
复制代码


6、列表的排序


  • 使用列表.sort()对列表进行永久排序

  • 直接在列表上进行操作,无返回值

  • 默认是递增的排序


ls = [2, 5, 2, 8, 19, 3, 7]ls.sort()ls
复制代码


[2, 2, 3, 5, 7, 8, 19]
复制代码


  • 递减排列


ls.sort(reverse = True)ls
复制代码


[19, 8, 7, 5, 3, 2, 2]
复制代码


  • 使用 sorted(列表)对列表进行临时排序

  • 原列表保持不变,返回排序后的列表


ls = [2, 5, 2, 8, 19, 3, 7]ls_2 = sorted(ls)print(ls)print(ls_2)
复制代码


[2, 5, 2, 8, 19, 3, 7][19, 8, 7, 5, 3, 2, 2]
复制代码


sorted(ls, reverse = True)
复制代码


[19, 8, 7, 5, 3, 2, 2]
复制代码


7、列表的翻转


  • 使用列表.reverse()对列表进行永久翻转

  • 直接在列表上进行操作,无返回值


ls = [1, 2, 3, 4, 5]print(ls[::-1])ls
复制代码


[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
复制代码


ls.reverse()ls
复制代码


[5, 4, 3, 2, 1]
复制代码


8、使用 for 循环对列表进行遍历


ls = [1, 2, 3, 4, 5]for i in ls:    print(i)
复制代码


12345
复制代码

3.2 元组

3.2.1 元组的表达

  • 元组是一个可以使用多种类型元素,一旦定义,内部元素不支持增、删和修改操作的序列类型


通俗的讲,可以将元组视作“不可变的列表”


names = ("Peter", "Pual", "Mary")
复制代码

3.2.2 元组的操作

  • 不支持元素增加、元素删除、元素修改操作

  • 其他操作与列表的操作完全一致

3.2.3 元组的常见用处

打包与解包


  • 例 1 返回值是打包成元组的形式


def f1(x):              # 返回x的平方和立方    return x**2, x**3   # 实现打包返回
print(f1(3))print(type(f1(3))) # 元组类型
复制代码


(9, 27)<class 'tuple'>
复制代码


a, b = f1(3)            # 实现解包赋值 print(a)print(b)
复制代码


927
复制代码


  • 例 2

  • 采用 zip 函数进行打包


numbers = [201901, 201902, 201903]name = ["小明", "小红", "小强"]list(zip(numbers,name))
复制代码


[(201901, '小明'), (201902, '小红'), (201903, '小强')]
复制代码


for number,name in zip(numbers,name):   # 每次取到一个元组,立刻进行解包赋值    print(number, name)
复制代码


201901 小明201902 小红201903 小强
复制代码

3.3 字典

3.3.1 字典的表达

  • 映射类型: 通过“键”-“值”的映射实现数据存储和查找

  • 常规的字典是无序的,仅可以通过键来对数据进行访问


students = {201901: '小明', 201902: '小红', 201903: '小强'}students
复制代码


字典键的要求


  • 1、字典的键不能重复


如果重复,前面的键就被覆盖了


students = {201901: '小明', 201901: '小红', 201903: '小强'}students
复制代码


{201901: '小红', 201903: '小强'}
复制代码


  • 2、字典的键必须是不可变类型,如果键可变,就找不到对应存储的值了

  • 不可变类型:数字、字符串、元组。  一旦确定,它自己就是它自己,变了就不是它了。

  • 可变类型:列表、字典、集合。  一旦确定,还可以随意增删改。因此这三个类型不能作为字典的键。


d1 = {1: 3}d2 = {"s": 3}d3 = {(1,2,3): 3}
复制代码


上面没有报错,说明是合法的。


d = {[1, 2]: 3}
复制代码


---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-68-bf7f06622b3f> in <module>----> 1 d = {[1, 2]: 3}

TypeError: unhashable type: 'list'
复制代码


d = {{1:2}: 3}
复制代码


---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-69-188e5512b5fe> in <module>----> 1 d = {{1:2}: 3}

TypeError: unhashable type: 'dict'
复制代码


d = {{1, 2}: 3}
复制代码


---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-70-c2dfafc1018a> in <module>----> 1 d = {{1, 2}: 3}

TypeError: unhashable type: 'set'
复制代码

3.3.2 字典的性质

  • 字典的长度——键值对的个数


students = {201901: '小明', 201902: '小红', 201903: '小强'}len(students)
复制代码


3
复制代码


  • 字典的索引


通过 字典[键] 的形式来获取对应的值


students = {201901: '小明', 201902: '小红', 201903: '小强'}students[201902]
复制代码


'小红'
复制代码

3.3.3 字典的操作方法

1、增加键值对


  • 变量名[新键] = 新值


students = {201901: '小明', 201902: '小红', 201903: '小强'}students[201904] = "小雪"students
复制代码


{201901: '小明', 201902: '小红', 201903: '小强', 201904: '小雪'}
复制代码


2、删除键值对


  • 通过 del 变量名[待删除键]


students = {201901: '小明', 201902: '小红', 201903: '小强'}del students[201903]students
复制代码


{201901: '小明', 201902: '小红'}
复制代码


  • 通过变量名.pop(待删除键)


students = {201901: '小明', 201902: '小红', 201903: '小强'}value = students.pop(201903)   # 删除键值对,同时获得删除键值对的值print(value)print(students)
复制代码


小强{201901: '小明', 201902: '小红'}
复制代码


  • 变量名.popitem() 随机删除一个键值对,并以元组返回删除键值对


students = {201901: '小明', 201902: '小红', 201903: '小强'}key, value = students.popitem()print(key, value)print(students)
复制代码


201903 小强{201901: '小明', 201902: '小红'}
复制代码


3、修改值


  • 通过先索引后赋值的方式对相应的值进行修改


students = {201901: '小明', 201902: '小红', 201903: '小强'}students[201902] = "小雪"students
复制代码


{201901: '小明', 201902: '小雪', 201903: '小强'}
复制代码


4、d.get( )方法


d.get(key,default) 从字典 d 中获取键 key 对应的值,如果没有这个键,则返回 default


  • 小例子:统计"牛奶奶找刘奶奶买牛奶"中字符的出现频率


s = "牛奶奶找刘奶奶买牛奶"d = {}print(d)for i in s:    d[i] = d.get(i, 0)+1 # 如果该字符第一次出现,则返回default 0 ,然后+1统计。如果之前就有i这个键,则返回该 key i 所对应的值。    print(d)# print(d)
复制代码


{}{'牛': 1}{'牛': 1, '奶': 1}{'牛': 1, '奶': 2}{'牛': 1, '奶': 2, '找': 1}{'牛': 1, '奶': 2, '找': 1, '刘': 1}{'牛': 1, '奶': 3, '找': 1, '刘': 1}{'牛': 1, '奶': 4, '找': 1, '刘': 1}{'牛': 1, '奶': 4, '找': 1, '刘': 1, '买': 1}{'牛': 2, '奶': 4, '找': 1, '刘': 1, '买': 1}{'牛': 2, '奶': 5, '找': 1, '刘': 1, '买': 1}
复制代码


5、d.keys( ) d.values( )方法


把所有的 key,value 单独拿出来。


students = {201901: '小明', 201902: '小红', 201903: '小强'}print(list(students.keys()))print(list(students.values()))
复制代码


[201901, 201902, 201903]['小明', '小红', '小强']
复制代码


6、d.items( )方法及字典的遍历


print(list(students.items()))for k, v in students.items():#进行解包    print(k, v)
复制代码


[(201901, '小明'), (201902, '小红'), (201903, '小强')]201901 小明201902 小红201903 小强
复制代码

3.4 集合

3.4.1 集合的表达

  • 一系列互不相等元素的无序集合(互斥)

  • 元素必须是不可变类型:数字,字符串或元组,可视作字典的键

  • 可以看做是没有值,或者值为 None 的字典


students = {"小明", "小红", "小强", "小明"}   #可用于去重students
复制代码


{'小强', '小明', '小红'}
复制代码

3.4.2 集合的运算

  • 小例子 通过集合进行交集并集的运算


Chinese_A = {"刘德华", "张学友", "张曼玉", "钟楚红", "古天乐", "林青霞"}Chinese_A
复制代码


{'刘德华', '古天乐', '张学友', '张曼玉', '林青霞', '钟楚红'}
复制代码


Math_A = {"林青霞", "郭富城", "王祖贤", "刘德华", "张曼玉", "黎明"}Math_A
复制代码


{'刘德华', '张曼玉', '林青霞', '王祖贤', '郭富城', '黎明'}
复制代码


  • 语文和数学两门均为 A 的学员

  • S & T 返回一个新集合,包括同时在集合 S 和 T 中的元素


Chinese_A & Math_A
复制代码


{'刘德华', '张曼玉', '林青霞'}
复制代码


  • 语文或数学至少一门为 A 的学员

  • S | T 返回一个新集合,包括集合 S 和 T 中的所有元素


Chinese_A | Math_A
复制代码


{'刘德华', '古天乐', '张学友', '张曼玉', '林青霞', '王祖贤', '郭富城', '钟楚红', '黎明'}
复制代码


  • 语文数学只有一门为 A 的学员

  • S ^ T 返回一个新集合,包括集合 S 和 T 中的非共同元素


Chinese_A ^ Math_A
复制代码


{'古天乐', '张学友', '王祖贤', '郭富城', '钟楚红', '黎明'}
复制代码


  • 语文为 A,数学不为 A 的学员

  • S - T 返回一个新集合,包括在集合 S 但不在集合 T 中的元素


Chinese_A - Math_A
复制代码


{'古天乐', '张学友', '钟楚红'}
复制代码


  • 数学为 A,语文不为 A 的学员


Math_A - Chinese_A
复制代码


{'王祖贤', '郭富城', '黎明'}
复制代码

3.4.3 集合的操作方法

  • 增加元素——S.add(x)


stars = {"刘德华", "张学友", "张曼玉"}stars.add("王祖贤")stars
复制代码


{'刘德华', '张学友', '张曼玉', '王祖贤'}
复制代码


  • 移除元素——S.remove(x)


stars.remove("王祖贤")stars
复制代码


{'刘德华', '张学友', '张曼玉'}
复制代码


  • 集合的长度——len(S)


len(stars)
复制代码


3
复制代码


  • 集合的遍历——借助 for 循环


for star in stars:    print(star)
复制代码


张学友张曼玉刘德华
复制代码


发布于: 刚刚阅读数: 4
用户头像

timerring

关注

还未添加个人签名 2022.07.14 加入

还未添加个人简介

评论

发布
暂无评论
Python基础(三) | Python的组合数据类型_Python._timerring_InfoQ写作社区