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) # 抛出异常
相关文章
|
1天前
|
Python
Python列表推导式是一种简洁的创建新列表的方式,它允许你在一行代码中完成对数据的操作和转换
【6月更文挑战第19天】Python列表推导式是创建新列表的简洁语法,它在一行内处理数据。表达式如`[expr for item in iterable if cond]`,其中`expr`是对元素的操作,`item`来自`iterable`,`if cond`是可选过滤条件。例如,将数字列表平方:`[x**2 for x in numbers]`。嵌套列表推导处理复杂结构,如合并二维数组:`[[a+b for a,b in zip(row1, row2)] for row1, row2 in zip(matrix1, matrix2)]`。简洁但勿过度复杂化。
11 5
|
1天前
|
Python
在Python中,解包参数列表和Lambda表达式是两个不同的概念
【6月更文挑战第19天】在Python中,解包参数允许将序列元素作为单独参数传递给函数,如`greet(*names_and_ages)`。而Lambda表达式用于创建匿名函数,如`lambda x, y: x + y`。两者可结合使用,如`max(*numbers)`找列表最大值,但过度使用lambda可能降低代码可读性。
11 3
|
1天前
|
Python
在Python中,`range()`函数生成一个整数序列,用于循环迭代。
【6月更文挑战第19天】`Python`的`range()`函数生成整数序列,用于迭代。它接受`start`(默认0)、`stop`(不包含,右开)和`step`(默认1)参数。在`for`循环中,`range(5)`会输出0到4。若要包含结束值,需将`stop`设为`end+1`,如`range(1, 6)`将输出1到5。
9 1
|
2天前
|
Python
在 Python 中,对列表进行排序有两种常用的方法
在 Python 中,对列表进行排序有两种常用的方法
|
2天前
|
索引 Python
python 取列表偶数和奇数位置的值
python 取列表偶数和奇数位置的值
10 5
|
5天前
|
机器学习/深度学习 调度 Python
SOFTS: 时间序列预测的最新模型以及Python使用示例
这是2024年4月《SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion》中提出的新模型,采用集中策略来学习不同序列之间的交互,从而在多变量预测任务中获得最先进的性能。
27 4
|
5天前
|
存储 索引 Python
【Python列表解锁】:掌握序列精髓,驾驭动态数据集合
【Python列表解锁】:掌握序列精髓,驾驭动态数据集合
|
6天前
|
存储 索引 Python
Python零基础入门-5 数据结构(列表和元组
Python零基础入门-5 数据结构(列表和元组
|
6天前
|
索引 Python
Python零基础入门-2 数字、字符串和列表
Python零基础入门-2 数字、字符串和列表
|
7天前
|
vr&ar 索引 Python
Python基础教程(第3版)中文版 第二章列 表和元组(笔记)
Python基础教程(第3版)中文版 第二章列 表和元组(笔记)