在Python语言中,列表list是可变对象,列表中可存放任意且不同类型的对象。
1.创建列表
# (1)直接创建
lst = [1, 2, 'a']
# (2)创建空列表然后添加元素
lst2 = []
lst2.append(1)
# (3)将其他可迭代对象转换成列表
lst3 = list('12a')
除此之外,还有一种常用生成方法——列表生成式。这种方式书写简洁且功能强大。
# 生成10以内偶数列表集合
lst = [i for i in range(10) if i % 2 == 0]
print(lst)
# 输出:[0, 2, 4, 6, 8]
2.列表合并
(1)append(n),将n整体作为元素添加
lst = [i for i in range(10) if i % 2 == 0]
n = [10]
lst.append(n)
print(lst)
# 输出:[0, 2, 4, 6, 8, [10]]
(2)extend(n),上面的结果大概率不是我们想要的,我们想要添加的是元素10而不是一个列表。
因此需要用到extend
lst = [i for i in range(10) if i % 2 == 0]
n = [10]
lst.extend(n)
print(lst)
# 输出:[0, 2, 4, 6, 8, 10]
(3)使用拼接符号“+”
lst = [i for i in range(10) if i % 2 == 0]
n = [10]
lst += n
print(lst)
# 输出: [0, 2, 4, 6, 8, 10]
3.访问元素
(1)通过索引index
lst = [0, 2, 4, 6, 8, 10]
print('第一个和最后一个元素分别是:', lst[0], lst[-1])
# 输出: 第一个和最后一个元素分别是: 0 10
当尝试访问一个超出列表范围的索引时,会报错
lst = [0, 2, 4, 6, 8, 10]
try:
print(lst[6])
except Exception as e:
print(e)
# 输出:list index out of range
(2)遍历
lst = [0, 2, 4, 6]
for i in range(len(lst)):
print('第{}个元素是{}'.format(i, lst[i]))
# 输出: 第0个元素是0
# 第1个元素是2
# 第2个元素是4
# 第3个元素是6
其他常用遍历方式
# 直接遍历元素
lst = [0, 2, 4, 6]
for l in lst:
print(l)
# 同时得到索引和值
for index, value in enumerate(lst):
print('第{}个元素是{}'.format(index, value))
(3)切片
切片并不是列表独有的,元组和字符串也可以。注意切片范围是左闭右开。
①基本用法
lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# [起始:结束:步长],起始默认0,结束默认最后,步长默认1
print(lst[0:10:2])
# 输出:[0, 2, 4, 6, 8]
②利用切片实现列表拷贝和逆序
lst = [0, 1, 2, 3, 4, 5]
lst2 = lst[:]
lst3 = lst
lst[0] = '被改变了'
print(lst, lst2, lst3)
# 输出:['被改变了', 1, 2, 3, 4, 5] [0, 1, 2, 3, 4, 5] ['被改变了', 1, 2, 3, 4, 5]
赋值只是传递了引用,即lst3和lst指向同一个对象,而list是可变对象。因此,改变这个对象的第一个元素,lst3的第一个元素也被改变了。同时,[:]这种方式相当于是做了一次拷贝,因此不受影响。(更多关于可变性与拷贝的知识,请参看我的另一个总结)Python 深拷贝和浅拷贝_Jiangugu的博客-CSDN博客Python 可变性与深浅拷贝https://blog.csdn.net/qq_45055172/article/details/121383198
# 步长为负数,就表示从后往前取
lst = [0, 1, 2, 3, 4, 5]
print('原列表逆序排列后为:', lst[::-1])
# 输出:原列表逆序排列后为: [5, 4, 3, 2, 1, 0]
③利用切片修改列表元素
注意事项:通过切片得到的仍然是一个列表,因此,等号右边也应该是一个等长度的列表才能完成元素替换修改。
lst = [0, 1, 2, 3, 4, 5]
lst[:3] = ['a', 'b']
print(lst)
# 输出:['a', 'b', 3, 4, 5]
lst = [0, 1, 2, 3, 4, 5]
lst[::2] = ['_'] * 3
print(lst)
# 输出:['_', 1, '_', 3, '_', 5]
['_'] * 3,这种写法也容易产生一些陷阱。
# lst=[[0,0,0],[0,0,0]],第一次乘3,表示复制了2次0;
# 第二次乘2,表示把列表“复制”了一次,两个列表其实是同一个对象。
lst = [[0] * 3]*2
lst[0][0] = 1
print(lst)
# 输出:[[1, 0, 0], [1, 0, 0]]
④切片解决了索引越界问题
lst = [0, 2, 4, 6, 8, 10]
print('获取列表前10个元素:', lst[:10])
# 输出:[0, 2, 4, 6, 8, 10]
3.检索和统计
(1)判断元素是否存在
lst = [0, 2, 4, 6, 8, 10]
print('元素3{}列表中'.format('在' if 3 in lst else '不在'))
# 输出:元素3不在列表中
(2)获得元素在列表中第一次出现位置
lst = [0, 2, 4, 6, 8, 10]
print('元素2在列表中位置:{}'.format(lst.index(2)))
# 输出:元素2在列表中位置:1
(3)统计元素出现次数
lst = [0, 2, 4, 6, 8, 2]
print('元素2在列表中出现次数:{}'.format(lst.count(2)))
# 输出:元素2在列表中出现次数:2
(4)求和(元素全部为数字)
lst = [0, 2, 4, 6, 8, 2]
print('所有元素之和:{}'.format(sum(lst)))
# 输出:所有元素之和:22
4.排序
list对象自身实现了sort方法,也可以调用python通用的sorted方法。需要注意的是,一个无返回,一个有返回。
lst = [4, 2, 0, 6, 8]
# lst.sort()方法无返回,不能赋值给新的变量
lst.sort()
print('顺序排序{}'.format(lst))
# sorted方法有返回
r_lst = sorted(lst, reverse=True)
print('逆序排序{}'.format(r_lst))
# 输出:顺序排序[0, 2, 4, 6, 8]
# 逆序排序[8, 6, 4, 2, 0]
进一步,sorted是产生了一个新的对象,通过查看id可知
lst = [4, 2, 0, 6, 8]
print(id(lst))
lst.sort()
print(id(lst))
r_lst = sorted(lst, reverse=True)
print(id(r_lst))
# 输出:1831577473544
# 1831577473544
# 1831577474056
5.删除
lst = [4, 2, 0, 6, 8]
# 删除元素
del lst[0]
print(lst)
# 删除列表
del lst
# 输出:[2, 0, 6, 8]