6.Python【序列】- 列表

简介: 6.Python【序列】- 列表

认识列表

列表(list) 是可变序列,是Python 最基本的数据结构之一,常用于存放同类项目的容器。Python对列表元素的类型没有严格的限制,每个元素可以是不同的类型。但是从代码的可读性和执行效率考虑,建议统一列表元素的数据类型。

列表具有如下特点。

  • 列表是有序的数据结构。内部数据的位置排列固定。
  • 通过下标索引访问内部数据。支持迭代和切片操作。
  • 列表是可变的数据类型。可以随意添加、删除和更新内部数据,列表会自动伸缩,确保内部数据无缝隙有序排列。
  • 内部数据统称为元素,元素的值可以重复,可以为任意类型的数据,如数字、字符串、列表、元组、字典和集合等。
  • 列表的字面值:在中括号内存放所有元素,元素之间使用逗号分隔。

构建列表

以中括号作为起始和终止标识符,其中包含零个或多个元素,元素之问通过逗号分隔。如果不包含任何元素,则表示一个空列表对象。语法如下:

[元素1,元素2,元素3,...,元素n]

使用list构造器可以将可迭代对象转换为列表,语法如下:

list()
list(iterable)

如果不包含任何参数,将创建一个空列表。构造器将构造一个列表,其中的项与 iterable 中的项具有相同的值与顺序。iterable可以是序列、支持选代的容器,或者其他可选代对象。

list1 = [] # 定义空列表
list2 = [1,2,3] # 直接定义列表
list3 = ['a',2,3] # 不同类型列表
list4 = list([1,2,3]) # 列表转列表
list5 = list((1,2,3)) # 元组转列表
list6 = list(range(1,4)) # 数字范围转列表
list7 = list({'a':1,'b':2,'c':3}) # 字典转列表 ['a','b','c']
list8 = list({1,2,3}) # 集合转列表
list9 = list('123) # 字符串转列表
list10 = list() # 空列表

列表推导式

推导式又称解析式,是可以从容器构建另一个新的数据容器的结构体,语法简洁,运行速度快,性能比循环好,列表推导式的语法格式如下:

[expr for value in iterable if condition]
# 类似于 for 循环结构
result = []        # 定义一个空列表
for value in iterable: # 遍历iterable迭代器对象
    if condition:      # 如果条件表达式为True
        result.append(expression) # 把该元素的值添加到列表中

其中,expr 表示一个表达式,value 表示与iterable 包含元素相关的值表达式,iterable 表示一个可迭代的对象,condition 表示要过滤的条件。过滤条件可选,取决于实际应用。

l1 = [i for i range(10)]
print(l1) # 输出[0,1,2,3,4,5,6,7,8,9]
l2 = [[i,char] for i,char in enumerate('python')]
print(l2) # 输出[[0,'p'],[1,'y'],[2,'t'],[3,'h'],[4,'o'],[5,'n']]

(1) for 循环前面加 iterable这种形式生成的元素个数不会少,只是根据 for 循环的结果使用不同的表达式。

(2) for 循环后面加 if。这种形式只选择符合条件的元素,所以元素个数与系件相关。

(3) 嵌套 for 循环。

l3 = [i if i%2 == 0 else 0 for i in range(10)]
print(l3) # 输出[0,0,2,0,4,0,6,0,8,0]
l4 = [i for in range(10) if i%2 == 0]
print(l4) # 输出[0,2,4,6,8]
m = [[1,2,3],[4,5,6],[7,8,9]] 
n = [col for row in m for col in row] # 嵌套for
print(n) # 输出[1,2,3,4,5,6,7,8,9]
n = [] # 定义临时列表
for row in m: # 遍历外层列表
    for col in row: # 遍历内层列表
        n.append(col) # 把元素添加到临时列表中
print(n) # 输出[1,2,3,4,5,6,7,8,9]
name = ['Bob','Tom',alice','Jerry','Wendy','Smith']
l5 = [name.upper() for name in names if len(name) > 3] # 先条件过滤,然后转换为大写
print(l5) # 输出['ALICE','JERRY','WENDY','SMITH']


操作列表

访问元素

访问元素,顾名思义就查看列表中元素,常见的有赋值和切片操作。

list 表示列表对象,index 表示下标索引,index 起始值为0,第一个元素的下标为0,最后一个元素的下标为len(list)-1。其中,len()函数可以统计列表元素的个数。

index 可以为负值,负值素列表示从右往左数,由-1开始,-1表示最后一个元素,负列表长度表示第一个元素。访问元素的语法格式如下:

list[index]
list1 = [1,2,3]
print(list1[-1]) # 输出 3

赋值或更新元素,value 为要赋的值,类型不限,index 不能超出索引范围,

list[index] = value

使用count()方法可以统计列表中指定元素出现的次数,如果不存在,则返回0。

list1 = [1,2,3,4,1,1]
print(list1.count(1)) # 输出 3
print(list1.count(5)) # 抛出异常

使用index()方法可以获取指定元素的下标索引。

list 表示列表对象,参数value 表示元素的值。start 和stop 为可选参数,start 表示起始检索的位置,包含start 所在位置,stop 表示终止检索的位置,不包含stop 所在的位置。

index()方法将在指定范围内,从左到石查找第一个匹配的元素,然后返回它的下标索引值。

list.index(value,start,stop)
list1 = [1,2,3,4,5,5,4,3,2,1,4,2,4]
print(list1.index(4,7,12)) # 输出 10
print(list1.index(20)) # 抛出异常

切片访问元素。

list 表示列表对象;start index:表示开始索引位置,默认为 0,包含该索引位置;end index:表示结束索引位置,默认为序列长度 len(sequence),不包含该索引位置;step:表示步长,默认为 1,但是不能为 0。

list[start_index:end_index:step]
list1 = [3,4,5,6,7,8,9,11,13,15,17]
print(list1[::]) # 输出所有元素
print(list1[::-1]) # 倒序元素
print(list1[100]) # 抛出异常
print(list1[100:]) # [] 空列表
print(list1[:100:1]) # 超出范围的显示 [] 空列表

如果指定下标超出列表的索引范围或者指定的元素不存在,将会抛出异常。但切片操作不会因为下标超出而抛出异常,而是简单地在序列尾部截断或者返回一个空序列。

遍历元素

遍历就是对列表中每个元素执行一次访问,常用于数据过滤处理。

使用whilelen()函数可以遍历列表。

list1 = ['a','b','c']
i = 0
while i < len(list1):  # 遍历列表
    list[i] = list1[i].upper() # 读取每个元素,然后转换为大写形式,再写入
    i += 1 # 下标自增
print(list1) # 输出 ['A','B','C']

for 主要用于遍历可选代对象,该语句语法简洁,且运行高效。item 引用每个元素,iterable 表示可迭代对象。当遍历所有元素之后,for 自动停止迭代。具体语法格式如下:

for item in iterable:
    # 处理语句
list1 = ['a','b','c']
for in list1: # 遍历列表
    list1[list1.index(i)]=i.upper  # 读取每个元素,然后转换为大写形式,再写入
print(list1) # 输出 ['A','B','C']
list2 = ['a','b','c','d']
for index,value in enumerate(list1): # 遍历enumerate元素
    list1[index] = value.upper() # 读取每个元素,然后转换为大写形式,再写入
print(list2) # 输出 ['A','B','C','D']
 

添加元素

使用append()方法可以再当前列表尾部追加元素,该方法执行效率高。list 表示对象,参数obj表示要添加到列表末尾的值。该方法在原列表上执行操作,没有返回值,语法如下:

list.append(obj)

list1 = ['a','b','c']
list1.append('d') # 追加一个元素
print(list1) # 输出['a','b','c','d']

使用extend()方法可以将一个可选代对象的所有元素添加到当前列表对象的尾部。通过extend()方法增加列表元素也不会改变当前列表对象的内存地址,属于原址操作。

a = [1,2,4]
print(id(a)) # 内存地址:878351704712
a.extend([7,8,9]) # 追加序列
print(a) # 输出[1,2,4,7,8,9]
print(id(a))# 内存地址:878351704712
 

使用列表对象的insert()方法可以将元素添加到指定下标位置。参数 index 表示插入的索引位置;obj 表示要插入列表中的对象。该方法没有返回值,只是在原列表指定位置插入对象。语法格式如下:

list.insert(index, obj)
a = [1,2,3,4]
print(id(a)) # 内存地址:47959883021
a.insert(3,6) # 下标为3的位置插入6
print(a) # 输出[1,2,3,6,4]
print(id(a))# 内存地址:47959883021

使用切片

list1 = [3,5,7]
list1[len(list1):]=[9] # 在尾部追加元素
list1[:3] = [1,2,3] # 替换前3各元素

删除元素

使用del命令可以刪除列表中指定位置的元素。

a = [1,2,3,4]
del a[2]
print(a) # 输出 [1,2,4]

使用pop()方法可以刪除并返回指定位置上的元素。语法格式如下:

list.pop(index=-1)

参数 index 表示要移除列表元素的索引值,默认值为-1,即删除最后一个列表值。如果给定的索引值超出了列表范围,将抛出异常。

a = [1,2,3,4]
e = a.pop() # 删除最后一个元素
print(a) # 输出 [1,2,3]
print(e) # 输出 4

使用remove()方法删除首次出现的指定元素。参数 obj 表示列表中要移除的对象,即列表元素的值。该方法没有返回值,如果列表中不存在要刷除的元素,则抛出异常。语法如下:

list.remove(obj)

a=[1,2.2,2,2,3,4,2,3,2,4]
for i in a[::]:  # 遍历切片
    if 2 == i: # 设置删除条件
        a.remove(i) # 刷除元素2
print(a) # 输出为 [1,3,4,3,4]
for i in range(len(a)-1,-1): # 从后往前检查
    ifa[i] == 2: # 设置删除条件
        del a[i] # 删除元素2
print(a) # 输出为 [1,3,4,3,4]

使用clear()方法可以删除列表中所有元素。该方法没有参数,也没有返回值。

a = [1,2,3,4]
a.clear()
print(a)

使用切片

list1 = [3,5,7,9,11]
del list1[:3] # 删除前3各元素
list1[:] = [] # 删除所有元素

复制列表

浅复制就是只复制列表对象的浅层关系,不再深入复制每个值所引用的对象。

import copy 
x = [1,2,[3,4]]
y = copy.copy(x) # copy()函数浅复制
print(id(x[2])) # 内存地址:2891781245440
print(id(y[2]))# 内存地址:2891781245440

深复制将会递归复制对象的所有子对象。使用copy模块的deepcopy()函数可以执行深复制。

import copy 
x = [1,2,[3,4]]
y = copy.deepcopy(x) # deepcopy()函数浅复制
print(id(x[2])) # 内存地址:2891781245440
print(id(y[2]))# 内存地址:2438547682368

使用切片,这也是浅复制

x = [1,2,[3,4]]
y = x[:]
print(id(x[2])) # 内存地址:2891781245440
print(id(y[2]))# 内存地址:2891781245440

删除列表

使用del命令可以删除列表。

list1 = [1,2,3]
del list1 # 删除列表
print(list1) # 抛出异常
相关文章
|
13天前
|
Python
11个提升Python列表编码效率的高级技巧
Python中关于列表的一些很酷的技巧
21 1
|
2天前
|
索引 Python
Python的列表操作有哪些?
Python的列表操作非常丰富,包括列表的创建、元素的访问、修改、添加、删除、切片、排序等多个方面。
21 12
|
3天前
|
Python
【Azure Function】发布 Python Function 到 Azure 成功,但是无法显示Function列表
"module not found" error: "Failure Exception: ImportError: libpq.so.5: cannot open shared object file: No such file or directory. Cannot find module."
|
5天前
|
存储 缓存 安全
Python元组不可变序列的奥秘与应用方式
Python 中的元组(Tuple)是一种有序的、不可变的数据结构,它是序列的一种特殊形式,就像一个固定大小的盒子,一旦放入物品就无法更换或移除。 元组可以包含任何类型的数据,如数字、字符串甚至是其他元组。 相比列表,元组在很多场景下提供了更高效、安全的选择。
|
10天前
|
存储 缓存 Python
Python中的列表(List)和元组(Tuple)是两种重要的数据结构
【7月更文挑战第12天】Python中的列表(List)和元组(Tuple)是两种重要的数据结构
10 1
|
11天前
|
机器学习/深度学习 数据采集 算法
Python实现Prophet时间序列数据建模与异常值检测(Prophet算法)项目实战
Python实现Prophet时间序列数据建模与异常值检测(Prophet算法)项目实战
|
11天前
|
Python
列表推导式(解析式)python
列表推导式(解析式)python
|
8天前
|
数据可视化 Python
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。
|
13天前
|
数据采集 机器学习/深度学习 数据挖掘
基于Python实现时间序列分析建模(ARIMA模型)项目实战
基于Python实现时间序列分析建模(ARIMA模型)项目实战
|
19天前
|
开发者 Python
震撼!深入理解Python数据类型后,我才明白为什么大神都用列表推导式
【7月更文挑战第2天】Python列表推导式是编程效率提升的秘密武器。它以简洁的一行代码替代循环和条件判断,创建新列表。不仅代码量减少、执行效率高,还提升了可读性和可维护性。列表推导式允许抽象复杂逻辑,支持嵌套,使问题解决更专注。掌握这一特性,让你的Python代码更“Pythonic”,向大神级别迈进!**