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

在这里插入图片描述

文章目录

  • 一、为什么要有列表?
  • 二、列表语法
  • 三、用索引获取列表中的单个值
  • 四、利用切片取得子列表
  • 五、利用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]}!")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基础进阶(二)

一、static修饰成员变量的特点 static&#xff08;静态的&#xff09;&#xff0c;它是一个修饰符&#xff0c;一般用来修饰成员变量&#xff0c;或者修饰成员方法。 作用&#xff1a;让类中的成员变量被多个对象所共享。 例子1 在Test1中进行测试 只在对象a中对num进行了修…

在MySQL中如何存储一个IPv4地址?

在MySQL如何存储IPv4地址&#xff1f;这个在秋招面试的过程中被问到过&#xff0c;没有答上来&#xff0c;今天猛地想起了这个问题&#xff0c;做一下复盘。 一个IPv4地址是由32位二进制来表示的&#xff0c;用点分十进制表示可以划分为4部分&#xff0c;每部分占8位&#xff…

16.Oracle数据库Row_number() over()函数排序使用方法

1.原始数据(部分) SELECT * FROM SCOTT.EMP ; 2.使用Row_number() over() 函数,排序 SELECT EMPNO,ENAME,SAL,DEPTNO,Row_number() over( order by sal) rs FROM SCOTT.EMP ; 根据工资排序并添加序号 3.使用Row_number() over() 函数,分组并排序 SELECT EMPNO,ENAME,SAL,DEPTN…

【人工智能Ⅰ】实验4:贝叶斯分类

实验4 贝叶斯分类 一、实验目的 1. 了解并学习机器学习相关库的使用。 2. 熟悉贝叶斯分类原理和方法&#xff0c;并对MNIST数据集进行分类。 二、实验内容 1. 使用贝叶斯方法对mnist或mnist variation数据集进行分类&#xff0c;并计算准确率。数据集从网上下载&#xff0…

HTML-标签之文字排版、图片、链接、音视频

1、标签语法 HTML超文本标记语言——HyperText Markup Language 超文本是链接标记也叫标签&#xff0c;带尖括号的文本 2、HTML基本骨架 HTML基本骨架是网页模板 html&#xff1a;整个网页head&#xff1a;网页头部&#xff0c;存放给浏览器看的代码&#xff0c;例如CSSbody…

建设银行新余市分行积极开展国债下乡宣传活动

近日&#xff0c;为了普及国债知识&#xff0c;提高农村居民对国债的认知度和投资意识&#xff0c;建设银行新余市分行组织员工前往下村开展了一场国债下乡宣传活动。 活动当天&#xff0c;工作人员早早地来到了下乡地点&#xff0c;悬挂起了国债宣传横幅&#xff0c;并摆放了…

高级I/O 基础概念

文章目录 什么是高级I/O五种常见高级I/O同步IO和异步IO多路转接是异步IO吗 什么是高级I/O 高级I/O&#xff08;Advanced I/O&#xff09;是指在计算机系统中进行输入和输出操作时使用的一种更高级的接口和技术。它提供了比传统的基本I/O操作更丰富和灵活的功能&#xff0c;以满…

换电池修复蓝牙耳机充不进电的故障

故障现象: 电池量异常低,充不进电,放入电池仓充不到一分钟就停止充电;开机使用,几秒钟就提示关机. 打开耳机外壳,万用表测量电池电压却在3.7-4.02v之间,貌似是没问题的.但无论如何充电都无济于事. 购买一颗9*9*4.5的30mah的锂电池,更换,故障消失.蓝牙电量显示100%,充放电都正…

MxL3706-AQ-R 2.0通道绑定同轴网络集成电路特性

MxL3706-AQ-R是Max线性公司的第三代MoCA2.0同轴网络控Z器SoC&#xff0c;可用于在现有的家庭同轴电缆上创建具有千兆位吞吐量性能的家庭网络。 该MxL3706-AQ-R工作在400MHz至1675MHz之间的无线电频率&#xff0c;并与satellite共存&#xff0c;电X和有线电视运营商的频率计划。…

Anaconda超简单安装教程,超简洁!!!(Windows环境下,亲测有效)

写下这篇文章的动机&#xff0c;是今天在装Anaconda的时候&#xff0c;本来想搜点教程按照教程一步一步安装的&#xff0c;但没想到&#xff0c;所谓“保姆级”教程呀&#xff0c;“最详细”之类的&#xff0c;好复杂。然后一些本应该详细说的反而一笔带过了。所以今天我想把我…

数据结构(六):堆介绍及面试常考算法

一、堆介绍 1、定义 堆是一种图的树形结构&#xff0c;被用于实现“优先队列”&#xff08;priority queues&#xff09;。优先队列是一种数据结构&#xff0c;可以自由添加数据&#xff0c;但取出数据时要从最小值开始按顺序取出。在堆的树形结构中&#xff0c;各个顶点被称…

《opencv实用探索·五》opencv小白也能看懂的图像腐蚀

1、图像腐蚀原理简单理解&#xff1a; 腐蚀是形态学最基本的操作&#xff0c;都是针对白色部分&#xff08;高亮部分&#xff09;而言的。即原图像中高亮部分被蚕食&#xff0c;得到比原图更小的区域。 2、图像腐蚀的作用&#xff1a; &#xff08;1&#xff09;去掉毛刺&…

【软件测试】白盒测试和黑盒测试

一、软件测试基本分类 一般地&#xff0c;我们将软件测试活动分为以下几类&#xff1a;黑盒测试、白盒测试、静态测试、动态测试、手动测试、自动测试等等。 黑盒测试 黑盒测试又叫功能测试、数据驱动测试或给予需求规格说明书的功能测试。这种测试注重于测试软件的功能性需…

基数排序及利用数组简化解题

红豆不堪看&#xff0c;满眼相思泪 本文主要是帮助大家熟练掌握利用数组进行有关判断的题目&#xff0c;看完本文后在之后的刷题中都可以利用这种思想&#xff0c;当然举例中的题目利用该种方法可能不是最优解&#xff0c;但绝对是你看到题目不用思考太多就可以做出来的方法&am…

Python入门06布尔值

目录 1 什么是布尔值2 怎么生成布尔值3 在控制程序中使用布尔值4 数据过滤、排序和其他高级操作总结 1 什么是布尔值 首先我们要学习一下布尔值的定义&#xff0c;布尔值是一种数据类型&#xff0c;它只有两个可能的值&#xff1a;True&#xff08;真&#xff09;或 False&…

悠络客受邀出席2023上海区域零售(餐饮)数字化运营实战沙龙研讨会

11月23日&#xff0c;由中国零售&#xff08;餐饮&#xff09;CIO俱乐部、《智慧零售与餐饮》主办的2023上海区域零售&#xff08;餐饮&#xff09;数字化运营实战沙龙研讨会在上海召开&#xff0c;悠络客合伙人兼销售副总裁张勇作为演讲嘉宾受邀出席了本次大会。 本次研讨会汇…

【紫光同创PCIE教程】——使用官方驱动在Windows下进行DMA读写操作/PIO读写操作

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 紫光同创官方主推的是在linux系统下开发驱动和上层软件&#xff0c;相应地&#xff0c;官方提供了在linux一个基于GTK2…

Python链式调用技巧:代码流畅无缝连接

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 链式调用是一种编程风格&#xff0c;它允许将多个方法调用连接在一起&#xff0c;形成一个连贯的操作链。在Python中&#xff0c;链式调用常常用于使代码更简洁、易读&#xff0c;尤其在处理数据处理和函数式编程…

AntDB“超融合+流式实时数仓”——打造分布式数据库新纪元

&#xff08;一&#xff09; 前言 据统计&#xff0c;在信息化时代的今天&#xff0c;人们一天所接触到的信息量&#xff0c;是古人一辈子所能接收到的信息量的总和。当今社会中除了信息量“多”以外&#xff0c;人们对信息处理的“效率”和“速度”的要求也越来越高。譬如&a…

二叉树题目:祖父结点值为偶数的结点和

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;祖父结点值为偶数的结点和 出处&#xff1a;1315. 祖父结点值为偶数的结点和 难度 5 级 题目描述 要求 给定二…