「Python编程基础」第5章:列表

news2024/12/26 10:46:25

在这里插入图片描述

文章目录

  • 一、为什么要有列表?
  • 二、列表语法
  • 三、用索引获取列表中的单个值
  • 四、利用切片取得子列表
  • 五、利用len()函数,获取列表的长度
  • 六、利用索引改变列表中的值
  • 七、列表的连接和复制
  • 八、用del语句删除列表中的值
  • 九、有了列表后,真香
  • 十、列表的遍历
  • 十一、in 和 not in操作符
  • 十二、列表中还有哪些内置函数?
    • index() 返回指定数据所在位置的下标
    • count() 返回统计指定数据在当前列表中出现的次数
    • pop() 默认删除列表最后一个元素,并返回被删除列表元素内容
    • remove() 移除列表中某个数据的第一个匹配项
    • clear() 清空列表
    • append() 列表结尾追加数据
    • extend() 列表结尾追加数据,如果数据是一个序列,则将这个序列的数据,逐一添加到列表
    • insert() 指定位置新增数据
    • reverse() 逆置数据
    • sort() 排序
    • copy() 复制
  • 十三、元组
  • 十四、利用list()和tuple()函数来转换类型
  • 练习题
  • 小练习源码

一、为什么要有列表?

我们之前的教程中已经提到基础的数据类型,比如”字符串、数值、布尔“等。现在我们要学习更为高阶、复杂的数据类型。

Python中的复杂数据类型,不仅仅有 列表 ,还有 元组、字典、集合

那他们的区别在哪?

基础的数据类型,通过学习和代码,我们了解到,它们只能存储 「单个数据」 。

复杂的数据类型,通过本章学习,你会发现,他们能欧存储包含多个 「基础数据」的数据集合,让存储和操作数据变得更简单。

二、列表语法

num_list = [1, 2, 3]
str_list = ["Kevin", "Tom", "Jack"]
all_type_list = ["Kevin", 6, "Jack", True, False, 13.1111, None]
list_in_list = [[[1, 2, 3], ["Kevin", "Tom", "Jack"]], [True, False, 13.1111, None]]

print(num_list)
print(str_list)
print(all_type_list)
print(list_in_list)

代码运行结果:

[1, 2, 3]
['Kevin', 'Tom', 'Jack']
['Kevin', 6, 'Jack', True, False, 13.1111, None]
[[[1, 2, 3], ['Kevin', 'Tom', 'Jack']], [True, False, 13.1111, None]]

我们不难发现,列表内可以存储 任意类型数据,甚至是多个列表的嵌套,当然仅仅是因为我们只学到列表

三、用索引获取列表中的单个值

str_list = ["Kevin", "Tom", "Jack"]
print(str_list[0])
print(str_list[1])
print(str_list[2])
print(str_list[-1])

代码运行结果:

Kevin
Tom
Jack
Jack

我们发现:

列表的最后一个数据,可以通过「最大索引」或负数索引「-1」来获取!

那如果是嵌套列表呢?

比如下面这个代码,我们想获取到“Kevin”。

list_in_list = [[[1, 2, 3], ["Kevin", "Tom", "Jack"]], [True, False, 13.1111, None]]

print(list_in_list[0][1][0])

代码运行结果:

Kevin

我们会发现,嵌套列表取值并没有初学者说的那么难。

只是根据索引,一直在向内取值。

现在我们来点小练习。(小练习的参考代码,可以看末尾。)

"""
我有3只猫,分别叫“KK,JJ,LL”,
今天早上,我给它们都说了声“早安,某某某”!
"""

四、利用切片取得子列表

索引可以取得列表中某个单个字,而 切片 可以获取到列表中多个值,结果是一个新的列表。

切片是利用一对括号来表示它的起始和结束,中间由一个冒号来分分隔。

str_list = ["Kevin", "Tom", "Jack", "CC"]
child_list = str_list[1:3]
print(child_list)

代码运行结果:

['Tom', 'Jack']

五、利用len()函数,获取列表的长度

我们在利用一个函数“len()”来看看列表的长度。

str_list = ["Kevin", "Tom", "Jack", "CC"]
print(len(str_list))
child_list = str_list[1:3]
print(child_list)

代码运行结果:

4
['Tom', 'Jack']

我们发现切片的取值规律:
1. 括号内的第1个数字,表示列表的下标起始位置。
2. 括号内的第2个数字,表示获取到列表长度的结束位置。

注意:

很多初学者,会很容易将下标的概念和长度混淆。

六、利用索引改变列表中的值

既然索引可以获取值,那么我们同样可以利用这一途径,改变列表中的这个值。

str_list = ["Kevin", "Tom", "Jack", "CC"]
str_list[1] = "测试划水老师傅"
print(str_list)

代码运行结果:

['Kevin', '测试划水老师傅', 'Jack', 'CC']

七、列表的连接和复制

列表的连接其实和字符串的连接是一样的。

str_list = ["Kevin", "Tom", "Jack", "CC"]
num_list = [1, 2, 3, 4, 5]
new_list = str_list + num_list
print(new_list)

代码运行结果:

['Kevin', 'Tom', 'Jack', 'CC', 1, 2, 3, 4, 5]

这样操作之后,我们发现,我们没有改变原有的列表数据,而是将新的连接列表,赋值给一个新的变量。

当然,你也可以用已有变量接收,只不过这样,会修改原有列表数据,我不太建议这样操作。

再来说说复制,其实估计大家已经明白复制怎么操作了。

str_list = ["Kevin", "Tom", "Jack", "CC"]
copy_list = str_list * 3
print(copy_list)

代码运行结果:

['Kevin', 'Tom', 'Jack', 'CC', 'Kevin', 'Tom', 'Jack', 'CC', 'Kevin', 'Tom', 'Jack', 'CC']

八、用del语句删除列表中的值

删除这里,我们就需要用到刚才学到的下标知识,其实就是删除下标对应的值,来看看代码。

str_list = ["Kevin", "Tom", "Jack", "CC"]
del str_list[0]
print(str_list)

代码运行结果:

['Tom', 'Jack', 'CC']

我们发现,这样的操作,会让源数据发生改变,所以谨慎操作。

九、有了列表后,真香

还记得我们学习列标签的变量存储吗?

比如,我们要保存我们目前都有哪些offer,你也许会这样创建变量,编写代码。

offer_1 = "A公司offer"
offer_2 = "B公司offer"
offer_3 = "C公司offer"
offer_4 = "D公司offer"

但是你不觉得累吗?如果你又有了新的offer,那不得再命名一个offer_5?

我们来写一个小程序,可以记录我们当前都拿到哪些offer,你会发现,这个程序好麻烦,还不如手动记录!

print("输入你第1个offer名称:")
offer_1 = input()
print("输入你第2个offer名称:")
offer_2 = input()
print("输入你第3个offer名称:")
offer_3 = input()
print("输入你第4个offer名称:")
offer_4 = input()
print("现在我都有哪些公司的offer?")
print(f"我现在已经有:{offer_1}{offer_2}{offer_3}{offer_4}")

代码运行结果:

输入你第1个offer名称:
A公司offer
输入你第2个offer名称:
B公司offer
输入你第3个offer名称:
C公司offer
输入你第4个offer名称:
D公司offer
现在我都有哪些公司的offer?
我现在已经有:A公司offer、B公司offer、C公司offer、D公司offer

如果没有学习列标签,我们会这样写,那学习列表之后,我们尝试将代码优化一下,使用单个变量来记录,并且当我拿到新offer后,也能正常输入,不需要在去定义变量。

offer_list = []
while True:
    offer_name = input("请输入你的offer名称:")
    if offer_name == "":  # 不输入任何内容,程序退出
        break
    offer_list = offer_list + [offer_name]
print(f'我现在已有offer如下:')
for offer in offer_list:
    print(offer)

代码运行结果:

请输入你的offer名称:A公司offer
请输入你的offer名称:B公司offer
请输入你的offer名称:C公司offer
请输入你的offer名称:D公司offer
请输入你的offer名称:
我现在已有offer如下:
A公司offer
B公司offer
C公司offer
D公司offer

你细细的品,假设数据有100个呢?

十、列表的遍历

刚才我们已经用了for循环获取列表中的所有值,我们在重点介绍下,关于列表的两种常用遍历方法。

"""
1.while循环遍历
"""
name_list = ["测试划水老师傅","Python","Java"]
i = 0
while i < len(name_list):
    print(name_list[i])
    i += 1

"""
2.for循环遍历
"""
name_list = ["测试划水老师傅","Python","Java"]
for i in name_list:
    print(i)

两种遍历方式,实现的结果是一样的。

测试划水老师傅
Python
Java

有同学会问:

遍历列表时,我还想知道值所在的下标是多少!我该怎么办?

很简单,我们学会使用一个函数enumerate(),就能很轻松解决这个需求。

name_list = ["测试划水老师傅","Python","Java"]
for index, value in enumerate(name_list):
    print(f"下标为{index}的值是:{value}")

代码运行结果:

下标为0的值是:测试划水老师傅
下标为1的值是:Python
下标为2的值是:Java

十一、in 和 not in操作符

字面意思,in表示这个值在列表中,not in表示这个值不在列表中。

name_list = ["测试划水老师傅","Python","Java"]
print("Python" in name_list)
print("Python" not in name_list)

代码运行结果:

True
False

求值结果是一个“布尔值”。

十二、列表中还有哪些内置函数?

index() 返回指定数据所在位置的下标

# 语法:列表序列.index(数据,开始位置下标,结束位置下标)

name_list = ["Kevin","Tom","Jack"]
print(name_list.index('Tom',0,2))
print(name_list.index('Kevin'))
print(name_list.index('Kevin_1111'))

"""代码运行结果:
1
0
Traceback (most recent call last):
  File "E:/giteespace/python/基础知识/列表.py", line 13, in <module>
    print(name_list.index('Kevin_1111'))
ValueError: 'Kevin_1111' is not in list
"""

count() 返回统计指定数据在当前列表中出现的次数

name_list = ["Kevin","Tom","Jack"]
print(name_list.count("Kevin"))
print(name_list.count("kevin"))
print(name_list.count("Bob"))

"""代码运行结果:
1
0
0
"""

pop() 默认删除列表最后一个元素,并返回被删除列表元素内容

name_list = ["测试划水老师傅","Python","Java"]
pop_name_one = name_list.pop()
print(name_list)
print(pop_name_one)

pop_name_two = name_list.pop(0)
print(name_list)
print(pop_name_two)


"""代码运行结果:
['测试划水老师傅', 'Python']
Java
['Python']
测试划水老师傅
"""

remove() 移除列表中某个数据的第一个匹配项

name_list = ["测试划水老师傅","Python","Java"]
remove_one = name_list.remove("Java")
print(name_list)

"""代码运行结果:
['测试划水老师傅', 'Python']
"""

clear() 清空列表

name_list = ["测试划水老师傅","Python","Java"]
name_list.clear()
print(name_list)

"""代码运行结果:
[]
"""

append() 列表结尾追加数据

name_list = ["Kevin","Tom","Jack"]
new_name_list = name_list.append("Bob")
print(name_list)
print(new_name_list)

#注意,append会修改原有列表数据
"""代码运行结果:
['Kevin', 'Tom', 'Jack', 'Bob']
None
"""

extend() 列表结尾追加数据,如果数据是一个序列,则将这个序列的数据,逐一添加到列表

name_list = ["Kevin","Tom","Jack"]
new_name_list = name_list.extend("Bob")
print(name_list)
print(new_name_list)
name_list.extend(["AA","BB"])
print(name_list)

#注意:
#1. extend会修改原有列表数据
#2. 会将序列的额数据,注意添加到列表,下方显示字符串、列表添加后的结果    


"""代码运行结果:
['Kevin', 'Tom', 'Jack', 'B', 'o', 'b']
None
['Kevin', 'Tom', 'Jack', 'B', 'o', 'b', 'AA', 'BB']
"""

insert() 指定位置新增数据

name_list = ["Kevin","Tom","Jack"]
new_name_list = name_list.insert(0,"Bob")
print(name_list)
print(new_name_list)

#注意:
#1. insert会修改原有列表数据    


"""代码运行结果:
['Bob', 'Kevin', 'Tom', 'Jack']
None
"""

reverse() 逆置数据

id = [1,2,4,4,5,1]
id.reverse()
print(id)

"""代码运行结果:
[1, 5, 4, 4, 2, 1]
"""

sort() 排序

"""
3.列表.sort(key=None, reverse=False)
注意:reverse表示排序规则 reverse=True 降序; reverse=False 升序(默认)
"""
id_sort = [1,2,4,4,5,1]
id_sort.sort()
print(id_sort)

"""run:
[1, 1, 2, 4, 4, 5]
"""

id_sort_True = [1,2,4,4,5,1]
id_sort_True.sort(reverse = True)
print(id_sort_True)

"""代码运行结果:
[5, 4, 4, 2, 1, 1]
"""

copy() 复制

保留原始数据基础上,进行复制数据,一般原始数据不做操作

"""
1.列表.copy()
"""
name_list = ["测试划水老师傅","Python","Java"]
new_name_list = name_list.copy()
print(name_list)
print(new_name_list)

"""代码运行结果:
['测试划水老师傅', 'Python', 'Java']
['测试划水老师傅', 'Python', 'Java']
"""

十三、元组

元组与列表其实很相似,甚至它们的内置函数都一样,但只有2点不一样。

  • 列表的括号是[],元组是()。
  • 元组像字符串一样,是不可变的。

那么什么是数据不可变?什么又是数据可变?

可变的:列表、集合、字典(可以进行更改,并且更改后物理地址不会发生改变)

不可变的:数字(整型、浮点数)、字符串、元组(不可以进行更改,更改后就是一个新的对象了,物理地址发生了变化)

# 列表 可变类型,append数据后,内存地址依然没有变化。
list_a = [10, 20]
list_b = list_a
print(f'list_b的值{list_b}')
print(f'list_a的内存地址{id(list_a)}')
print(f'list_b的内存地址{id(list_b)}')
list_a.append(30)
print(f'list_b的值{list_b}')
print(f'list_a的内存地址{id(list_a)}')
print(f'list_b的内存地址{id(list_b)}')
"""代码运行结果:
list_b的值[10, 20]
list_a的内存地址1873382598272
list_b的内存地址1873382598272
list_b的值[10, 20, 30]
list_a的内存地址1873382598272
list_b的内存地址1873382598272
"""
a = 10
b = a
print(f'a的值{a}')
print(f'a的内存地址{id(a)}')
print(f'b的内存地址{id(b)}')

a = 2
print(f'b的值{b}')
# 因为修改了a的数据,内存需要开辟新的地址存储
print(f'a的内存地址{id(a)}')
print(f'b的内存地址{id(b)}')
"""代码运行结果:
a的值10
a的内存地址3115119477264
b的内存地址3115119477264
b的值10
a的内存地址3115119477008
b的内存地址3115119477264
"""

十四、利用list()和tuple()函数来转换类型

我们已经学习了列表和元组,甚至知道元组是不可变类型,那当我就想要变可怎么办?

这时候我们需要将它的数据类型变更。

tuple_data = (1, 2, 3)
print(type(tuple_data))
change_list = list(tuple_data)
print(type(change_list))

"""代码运行结果:
<class 'tuple'>
<class 'list'>
"""

练习题

"""
练习题:
有三个办公室,8位老师,8个老师随机分配到3个办公室
1. 准备数据
    1.1 8位老师 -- 列表
    1.2 3个办公室 -- 列表嵌套
2. 分配老师到办公室
    *** 随机分配
    把老师的名字写入到办公室列表 -- 办公室列表追加老师数据
3. 验证是否分配成功
    打印办公室详细信息;每个办公室的人数和对应的老师名字
"""
"""
需求:
进入系统显示系统功能页面,功能列表如下:
1. 添加学员
2. 删除学员
3. 修改学员信息
4. 查询学员信息
5. 显示所有学员信息
6. 退出系统
系统共6个功能,用户根据自己需求选取。
"""

小练习源码

"""
我有3只猫,分别叫“KK,JJ,LL”,
今天早上,我给它们都说了声“早安,某某某”!
"""
cat_list = ['KK', 'JJ', 'LL']
print(f"早安,{cat_list[0]}!")
print(f"早安,{cat_list[1]}!")
print(f"早安,{cat_list[2]}!")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1271620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决:uniapp项目打包微信小程序时,报错:failed to load config from /xx/xx-mall/vite.config.ts

复现步骤&#xff1a;在vscode终端中运行&#xff1a;pnpm build:mp-weixin-prod 命令&#xff0c;打包小程序生产包时&#xff0c;报错failed to load xxx/vite.config.ts&#xff0c;但实际项目根目录中有该vite.config.ts文件。 项目使用技术&#xff1a;uniapp vue3 node…

2023年第三届中国高校大数据挑战赛思路及代码

比赛时间&#xff1a;2023.12.28 08:00 至 2023.12.31 20:00 赛题方向介绍 1、大数据统计分析方向 涉及内容包含&#xff1a;数据的清洗、数据的预测、数据之间的关联分析、综合评价、分类与判别等 2、文本或图象分析方向 涉及内容包含&#xff1a;计算机视觉基础、特征匹配…

记录labelImg上手过程

一、安装 Labelimg&#xff08;目标检测标注工具&#xff09;安装_labelimg安装_向南不向北的博客-CSDN博客 二、打开 进入anaconda虚拟环境后&#xff0c;cd到labelimg文件夹&#xff0c;然后输入命令 python labelImg.py 三、基础设置 打标工具labelimg安装和使用教程-C…

前端三大MV*模式:MVC、mvvm、mvp模式介绍

MVC&#xff08;同步通信为主&#xff09;&#xff1a;Model、View、Controller MVP(异步通信为主)&#xff1a;Model、View、Presenter MVVM(异步通信为主)&#xff1a;Model、View、ViewModel mvc模式介绍 MVC&#xff08;Model–View–Controller&#xff09;模式是软件…

CCS中静态库lib的生成与调用

在调试DSP设备的时候&#xff0c;发现好多工程会把比较核心的代码生成静态库lib&#xff0c;代码运行的时候直接调用lib里面的相关函数就行。但是从外部是看不到lib库里面的内容的&#xff0c;这样通过静态库的方式实现对代码的加密。 在网上找了好久如何将函数生成静态库*.lib…

PyQt6 QToolButton工具按钮控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计32条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

python + mongodb使用入门

最近用了下mongodb &#xff0c;简单做个记录&#xff1a; 1.启动系统mongo服务 mongod -f mongod.conf其中 mongod.conf 是配置文件&#xff0c;示例如下&#xff1a; dbpath/youpath/data/db #数据库保存位置 logpath/youpath/data/mongod.log #日志 logappendtrue fo…

LeetCode刷题日志-30串联所有单词子串

最简单的思路就是&#xff0c;将words里的单词全排列&#xff0c;然后在s中比对&#xff0c;但是复杂度太高阶乘级别。 如何优化&#xff1f; 题目说明子串是包含words中所有单词&#xff0c;且任意顺序&#xff0c;我们可以使用一个map来存储words中每个单词以及对应数量&…

wyler水平仪维修WYLER倾角仪维修CH-8405

瑞士WYLER电子水平仪维修&#xff1b;BIueCLINO倾斜度测量仪维修&#xff1b;wyler电子倾角仪维修。 水平仪常见故障及处理方法 1、 仪表通电不工作。 A、检查仪表220V电源端子接线是否正确 B、检查仪表电容是否熔断&#xff1b; C、拧下仪表后的固定螺钉&#xff0c;将表…

Android笔记(十六):前台服务

设置服务为前台服务。前台服务会在状态栏显示一个通知。通知界面与服务进行关联。 一、什么是通知&#xff1f; Notification通知是在移动应用APP提供给用户的消息提示&#xff0c;是在移动系统的通知栏中显示。当移动应用不在运行时或者在后台状态下&#xff0c;通过发布通知…

Python快速实现BMI(身体质量指数)计算器(窗口界面形式)

BMI是身体质量指数&#xff08;Body Mass Index&#xff09;的缩写&#xff0c;是一种衡量人体肥胖程度的指标。它是根据人的身高和体重计算得出的&#xff0c;公式为&#xff1a; BMI 体重&#xff08;kg&#xff09;/ 身高^2&#xff08;m&#xff09; 其中&#xff0c;体…

有它再也不用PS制作企业期刊了!

随着互联网的发展&#xff0c;越来越多的人开始使用在线工具来制作企业期刊。但是&#xff0c;对于一些新手来说&#xff0c;使用PS等专业的图像处理软件可能会感到非常困难。那么&#xff0c;有没有一种简单易用的方法来制作企业期刊呢&#xff1f;答案是肯定的&#xff01; 所…

老师选班干部的方法

我经常被问到这样一个问题&#xff1a;“老师&#xff0c;你怎么选班干部的&#xff1f;”那我就来分享一下我的经验吧&#xff0c;希望能给广大教师朋友提供一些参考。 选班干部之前先要明确一点&#xff0c;班干部是做什么的&#xff1f;有什么职责。班干部是班级的核心力量&…

什么是gRPC

gRPC&#xff08;gRPC Remote Procedure Call&#xff09;是由 Google 开发的开源 RPC 框架&#xff0c;它基于 HTTP/2 标准&#xff0c;使用 Protocol Buffers 作为接口定义语言&#xff08;IDL&#xff09;。gRPC 提供了一种高效、跨语言、跨平台的远程过程调用&#xff08;R…

如何制作一个数字人?流程是怎样的?

​​虚拟人概念从早期动漫领域的初音未来用一首《甩葱歌》让绿色双马尾的“歌姬”形象火出圈&#xff0c;到洛天依登上央视春晚舞台&#xff0c;再到众多虚拟歌手、虚拟主播、KOL、代言人等活跃于各种情境中。 去年以来&#xff0c;元宇宙和虚拟人技术进入全球科技产业的聚光灯…

牛客算法心得——abb(dp)

大家好&#xff0c;我是晴天学长&#xff0c;传智杯的题&#xff0c;我准备写一个题解&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .abb leafee 最近爱上了 abb 型语句&#xff0c;比如“叠词词”、…

量化误差的测量

因为转换的精度有限&#xff0c;所以将模拟值数字化时会不可避免地出现量化误差。量化误差由转换器及其误差、噪声和非线性度决定。当输入信号和计数器时基有区别时就会产生量化误差。根据输入信号的相位和计数器时基的匹配程度&#xff0c;计数器有下列三种可能性&#xff1a;…

光伏设计软件操作指南

在能源产业的变革中&#xff0c;光伏将成为未来最大的绿电来源。光伏电站未来25年的发电量、后期的运维等&#xff0c;都需要借助严谨的设计。光伏设计软件可以帮助设计者减少工作量&#xff0c;降低人工计算的错误&#xff0c;使得数据更精确。 1.了解软件构成 光伏设计软件专…

Carbonyl ,一个可以在终端里运行的浏览器

浏览器对于我们的日常来说是使用频率比较高的一个东西。 一般来说&#xff0c;对于桌面的发行版的linux的浏览器&#xff0c;用的比较多的是Firefox浏览器。对于我们日常windows、mac等。常用的有chrome、edge等。 但是&#xff01;在终端里运行一个浏览器&#xff0c;我想大多…

8.0 新特性 - Generated Invisible Primary Key

文章目录 说明1. GIPK 介绍1.1 参数设置2.2 可见性测试2.3 修改元数据可见性2.4 修改查询可见性 2. GIPK 测试2.1 Binlog 分析2.2 主从复制2.3 逻辑备份2.4 其它限制2.4.1 AUTO_INCREMENT 属性2.4.2 my_row_id 关键字 后记 说明 MySQL Innodb 引擎采用的是 IOT&#xff08;索引…