首页 > temp > python入门教程 >
-
Python 列表的重要操作
列表是python中内置的数据结构,它的表现形式为方括号中不同数据的集合,用逗号分隔开。列表可以用来存储相同数据类型或不同数据类型。
列表是可变的,这也是它如此常用的原因,然而在某些情况下,可变性需要特别注意。
本文介绍了关于python 列表的重要操作,帮助你更好的掌握列表。
1.从列表删除元素的三种方法
(1)del
del可以根据索引位置,删除某个元素,也可以设定索引范围删除,亦可以删除整个列表,没有返回值
删除单个元素
a = [1, 2, 'x', 4, 5] del(a[0]) print(f'a is {a}')
输出
a is [2, 'x', 4, 5]
范围删除元素
a = [1, 2, 'x', 4, 5] del (a[0:2]) print(f'a is {a}')
输出
a is ['x', 4, 5]
删除整个列表
a = [1, 2, 'x', 4, 5] del (a[:]) print(f'a is {a}') # 使用切片按索引范围删除整个列表的元素,将输出一个空列表a is [] a = [1, 2, 'x', 4, 5] del (a) print(f'a is {a}') # name 'a' is not defined 没有返回值,报错找不到对象
(2)remove
remove()函数用于移除列表中某个值的第一个匹配项,没有返回值
例子
a = [1, 2, 'x', 4, 5,] a.remove('x') print(f'a is {a}')
输出
a is [1, 2, 4, 5]
注意:只会删除第一个匹配值,如有重复将不会删除
a = [1, 2, 'x', 4, 5,'x'] a.remove('x') print(f'a is {a}')
输出:
a is [1, 2, 4, 5, 'x']
(3)pop
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
例子
a = [1, 2, 'x', 4, 5] b = a.pop() print(f'a is {a}') print(f'b is {b}')
输出
a is [1, 2, 'x', 4] b is 5
我们可以指定删除元素的索引值,不能超过列表总长度。
a = [1, 2, 'x', 4, 5] b = a.pop(0) print(f'a is {a}')
输出
a is [2, 'x', 4, 5]
2.列表的添加,扩展,插入
(1)append
append() 函数用于在列表末尾添加新的对象。
a = [1, 2] a.append(3) print(a)
输出
[1, 2, 3]
可以是任何数据类型,被追加的元素在列表中保持着原结构类型
a = [1, 2] b = ['x', 'y', 'z'] a.append(b) print(a)
输出
[1, 2, ['x', 'y', 'z']]
列表b成为了列表a中的第三项,如果你想创建一个列表是a,b列表中元素的组合a =(1, 2, 'x', 'y', 'z'),则需要使用extend()函数或者"+“。
(2)extend
extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
a = [1, 2] b = ['x', 'y', 'z'] a.extend(b) print(a)
输出
[1, 2, 'x', 'y', 'z']
(3)insert
insert() 函数也用于向列表中添加元素。但是,它允许指定新元素的索引。例如,我们可以在列表的开头添加一个新元素
a = [1, 2, 3, 4, 5] a.insert(0, 'a') print(a)
输出
['a', 1, 2, 3, 4, 5]
insert()中的第一个参数是索引,第二个是插入的对象
3.用”=“复制列表
我们可以复制一个列表并创建一个新的变量。
a = [1, 2, 3] b = a print(b)
但是,新变量“ b”只是指向“ a”值的指针。 因此,a的任何变化也会改变b。 让我们添加一个值来确认。
a = [1, 2, 3] b = a a.append(4) print(a) print(b)
输出
[1, 2, 3, 4]
[1, 2, 3, 4]
4.使用切片复制列表
我们可以使用切片选择列表的所有索引来复制列表。
a = [1, 2, 3] b = a[:] print(b)
新的列表b包含与a相同的值,但在不同的内存位置。如果我们改变a,b不会受到影响。
a = [1, 2, 3] b = a[:] a.append(4) print(a) print(b)
输出
[1, 2, 3, 4]
[1, 2, 3]
使用copy()函数复制列表的工作原理与使用索引复制相同。
a = [1, 2, 3] b = a.copy() a.append(4) print(a) print(b)
输出
[1, 2, 3, 4]
[1, 2, 3]
5. 用sort()和sorted()对列表进行排序。
sort和sorted函数都可以用来对列表进行排序。
- sort():对列表进行排序,但不返回任何内容。
- sorted():返回列表的排序副本,但不对原始列表进行排序。
sort()
a = [2, 0, 4, 3] b = a.sort() print(a) print(b)
输出
[0, 2, 3, 4]
None
用sorted()函数做同样的例子。
a = [2, 0, 4, 3] b = sorted(a) print(a) print(b)
输出
[2, 0, 4, 3]
[0, 2, 3, 4]
6. 通过复制创建嵌套列表
在通过复制创建一个嵌套的列表时,我们需要注意元素的变化。原列表元素的任何修改都会改变被复制的列表。
a = [1, 2] b = ['x', 'y'] c = [a, b] a.append(3) b.pop() print(a) print(b) print(c)
列表c由列表a和列表b组成,我们通过添加和删除一个元素更新了列表a和列表b。因此,列表c也被更新了。
输出
[1, 2, 3] ['x'] [[1, 2, 3], ['x']]
7、迭代过程中修改列表需要注意的
列表是可迭代的对象,因此通常在循环中使用它们。迭代基于索引,因此如果在迭代时更新列表,则需要注意。
下面的代码。 我们的需求是,如果a列表中同样的元素也位于列表b中,它将删除该项目。
a = ['x', 'y', 'z', 't'] b = ['x', 'y', 'u', 'v'] for item in a: if item in b: a.remove(item) print (a) print (b)
执行代码后,我们希望列表a变为[‘z’,‘t’]。看看实际发生了什么。
['y', 'z', 't'] ['x', 'y', 'u', 'v']
为什么'y'没有被删除呢?原因是循环执行第一步删除’x'时,列表的索引会同步更新。列表a中的a[1]索引变成了'z',for循环会比较列表中的第二个元素,比较的是'z'和‘y‘。因此'y'就没被删除
8、列表推导式(List comprehensions)
列表推导式提供了一种简明扼要的方法来创建列表。列表推导式的语法比for循环更简洁,执行效率也更高。
语法
list = [表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]
if不是必须的,可以省略
简单的示例,让b列表中只包含a列表的偶数元素
a = [1, 2, 4, 5, 7, 9, 11] b = [x for x in a if x % 2 == 0] print (b) # [2,4]
等价于
for item in a: if item % 2 == 0: b.append(item)
1行代码总要比三行更简洁吧~~
9.嵌套列表的列表推导式
我们可以在列表推导式中对嵌套列表进行迭代,比如有以下列表
vals = [[1,2,3],[4,5,2],[3,2,6]]
我们想得到嵌套列表中的每个元素,需要的输出为
vals_exp = [1,2,3,4,5,2,3,2,6]
用列表推导式来实现
vals = [[1,2,3],[4,5,2],[3,2,6]] vals_exp = [y for x in vals for y in x] print (vals_exp) # [1, 2, 3, 4, 5, 2, 3, 2, 6]
如果执行流程不够明确的话,可以先尝试用for循环操作,以下是对比流程图
总结:
列表与元组的用法,结构都很类似。区别主要有
1. 列表是动态的, 长度可变, 可以随意的增加、删减或改变元素, 列表的存储空间略大于元组, 性能略差与元组
2. 元组是静态的, 长度大小固定, 不可以对元素进行增加、删减或改变操作, 元组相对于列表更加轻量级, 性能稍优