06. 列表
一、什么是列表
Python 中列表是由一系列按特定顺序排列的元素组成的,它是 Python 中内置的可变序列。在形式上,列表的所有元素都放在一对中括号 “[]” 中,两个相邻元素间使用逗号 “,” 分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入到列表中,并且同一个列表中,元素的类型可以不同,因为它们之间没有任何关系。
二、列表的创建、删除和访问
2.1、列表的创建
【1】、使用 [] 创建列表
我们可以通过 [] 来创建列表,同其它类型的 Python 变量一样,创建列表时,也可以使用赋值运算符“=”直接将一个列表赋值给变量,语法格式如下:
listname = [element1,element2,...]
我们可以通过 [] 来创建一个空列表:
names = [] # 创建一个空列表
print(names)
print(type(names))
列表中存储的数据,我们称为元素。一个列表中可以存储多个元素,也可以在创建列表时,指定列表中的元素。
names = ["Sakura","Mikoto","Shana"]
print(names)
print(type(names))
列表中可以保存任意的对象:
# 列表中可以保存任意的对象
my_list = [10,"hello",True,None,[1,2,3],print]
print(my_list)
在使用列表时,虽然可以将不同类型的数据放入到同一个列表中,但是通常情况下,我们不会这样做,而是将一个列表中的数据只放入一种类型的数据,这样可以提高程序的可读性。
【2】、使用 list() 方法创建列表
在 Python 中,可以使用 list() 函数直接将可迭代对象转换为列表。
listname = list(data)
其中,data 标识可以转换为列表的数据,其类型可以是 range 对象、字符串、元组 或者 其它 可迭代 类型的数据。
num = list(range(1,11))
print(num)
print(type(num))
2.2、列表的删除
对于已经创建好的列表,不再使用时,可以使用 del 语句将其删除,语法格式如下:
del listname
name = ["Sakura","Mikoto","Shana"]
print(name)
del name[1]
print(name)
del name
在删除列表前,一定要保证的输入的列表对象是已经存在的,否则会出现以下错误:
NameError: name "names" is not defined
del 语句在实际开发中,并不常用。因为 Python 自带的垃圾回收机制会自动销毁不用的列表;
2.3、访问列表元素
列表中的对象都会按照插入的顺序存储到列表中,第一个插入的对象保存到第一个位置,第二个保存在第二个位置。我们也可以通过 索引 的方式获取指定的元素。索引 是元素在列表中的位置,列表中的每一个元素都有一个索引。索引是 0 开始的整数,列表第一个位置索引为 0,第二个位置索引为 1,依次类推。它的语法格式如下:
listname[index]
names = ["Sakura","Mikoto","Shana"]
print(names[0])
print(names[1])
print(names[2])
如果使用的索引超过最大的索引会报以下错误:
IndexError: list index out of range
在 Python 中索引可以是 负数。这个索引从右向左计数,也就是从最后的一个元素开始计数,即最后一个元素的索引是 -1,倒数第二个第二个元素的索引值为 -2,以此类推。
names = ["Sakura","Mikoto","Shana"]
print(names[-1])
print(names[-2])
print(names[-3])
在 Python 中,第一个列表元素的索引为 0,而不是 1;
在采用负数做索引时,是从 -1 开始的,而不是从 0 开始的,即最后一个元素的下标为 -1,这是为了防止与第一个元素重合。
2.4、遍历列表
遍历列表,指的就是将列表中的所有元素取出来,我们可以使用 for 循环直接遍历列表。for 循环的代码块会执行多次,序列中有几个元素就会执行几次,每执行依次就会将序列中的一个元素赋值给变量。
for item in listname :
# 遍历列表操作
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
for name in names:
print(name)
我们还可以通过如下的方法获取列表中的索引和元素。
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
for i in range(len(names)):
print('{}:{}'.format(i,names[i]))
我们还可以使用 while 循环来遍历列表。
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
i = 0
while i < len(names):
print("{}:{}".format(i,names[i]))
i += 1
三、列表元素的增删改查
3.1、向列表中添加元素
【1】、在列表末尾添加元素
我们可以通过列表对象的 append() 方法在列表的末尾添加元素,语法格式如下:
listname.append(obj)
names = ["Sakura","Mikoto","Shana"]
print(names)
names.append("Rimuru")
print(names)
【2】、在列表中插入元素
我们还可以使用 insert() 方法向列表中的指定位置插入一个元素。为此,需要指定新元素的索引和值,它的语法格式如下:
listname.insert(index, obj)
names = ["Sakura","Mikoto","Shana"]
print(names)
names.insert(2,"Rimuru")
print(names)
3.2、删除列表中的元素
删除元素主要由两种情况,一种是根据 索引 删除,另一种是根据 元素值 进行删除。
【1】、使用 del 语句删除元素
我们可以使用 del 关键字删除指定索引的元素,它的语法格式如下:
del listname[index]
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
print(names)
del names[-1]
print(names)
【2】、使用 pop 方法删除元素
我们可以使用 pop() 方法删除指定索引的元素,并将其返回给变量使用。如果不指定索引,默认删除最后一个。
listname.pop([i]) # 根据索引删除并返回指定元素
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
print(names)
# 根据索引删除元素并返回
name = names.pop(2)
print(names)
print(name)
# 删除最后一个元素并返回
name = names.pop()
print(names)
print(name)
【3】、根据值删除元素
如果要删除一个不确定其位置的元素(即根据元素值删除),可以使用列表对象的 remove() 方法实现。如果相同的值有多个,只会删除第一个值,它的语法格式如下:
list.remove(x)
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
print(names)
names.remove("Kikyō")
print(names)
如果要使用 remove() 方法删除一个不存在的元素会报以下错误:
ValueError: list.remove(x): x not in list
3.3、修改列表中的元素
修改列表中的元素只需要通过 索引 获取该元素,然后再为重新赋值即可。
listname[index] = obj
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
print(names)
names[3] = "Kikyo"
print(names)
3.4、查询列表中的元素
在 Python 中,我们还可以使用 in 关键字检查某个元素是否为列表的成员,即检查某个元素是否包含在某个列表中。如果存在,返回 True,否则返回 False。
element in listname
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
result = "Sakura" in names
print(result)
另外,在 Python 中,我们还可以使用 not in 关键字实现检查某个元素是否不包含在指定的列表中。如果不在,返回 True,否则返回 False。
element not in listname
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
result = "Sakura" not in names
print(result)
3.5、清空列表
我们可以使用 clear() 方法清空列表,它的语法格式如下:
list.clear()
names = ["Sakura","Mikoto","Shana"]
print(names)
names.clear()
print(names)
四、列表切片
切片是从现有的列表中,获取一个子列表,不会影响原有的列表。实现切片的语法格式如下:
list[start : end : step]
通过切片获取元素时,会包括起始位置的元素,不会包括结束位置的元素。如果不指定起始位置,默认从 0 开始,如果不指定截至位置,默认为列表的长度。
在进行切片操作时,如果指定了步长,那么将会按照步长遍历列表的元素,否则,将一个一个遍历列表。如果省略步长,默认为 1,最后的一个冒号也可以省略。
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
name = names[1:5:2]
print(names)
print(name)
# 如果省略步长,则默认步长为1
name = names[1:5]
print(name)
# 如果省略截至位置,会一直截取到最后
name = names[1:]
print(name)
# 如果省略开始位置,则会从第一个元素开始截取
name = names[:5]
print(name)
如果想复制整个列表,可以将 起始位置 和 截至位置 都省略,但是中间的冒号要保留。
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
# 如果省略开始位置和截至位置,会复制(浅拷贝)一个列表
name = names[:]
print(names)
print(name)
步长不能为 0, 但是可以为负数,如果是负数,将从列表的后部向前取元素。
names = ["Sakura","Mitoto","Shana","Kikyō","Kagome","Moroha"]
# 步长如果是负数,则会从列表的后部向前面取元素
name = names[::-1]
print(names)
print(name)
我们还可以通过 切片 的方式来修改列表。
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
print(names)
# 使用新的元素替换旧的元素
names[0:2] = ["Rimuru","Akame","Kurome"]
print(names)
# 向索引为0的位置插入元素
names[0:0] = ["Sakura"]
print(names)
# 通过切片删除元素
del names[1:3]
print(names)
# 当设置步长之后,序列汇总的元素个数必须和切片汇总的额元素个数一致
names[::2] = ["Nanoha","Fate","Hayate"]
print(names)
五、列表的常用操作
【1】、列表相加
在 Python 中,支持列表进行相加操作,即将两个列表进行拼接,不会去除重复的元素,使用加(+)运算符实现。语法格式如下:
names1 = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
names2 = ["Akame","Kurome","Sakura"]
names = names1+names2
print(names)
【2】、列表乘法
在 Python 中,使用数字 n 乘以一个列表会生成一个新的列表。新列表的内容为原来列表被重复 n 次的结果。
names1 = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
names2 = names1 * 3
print(names2)
【3】、计算列表的长度、最大值 和 最小值
在 Python 中,提供了内置函数计算列表的长度、最大值和最小值分别是:
len(s) # 获取列表的长度
min(iterable, *, key=None) # 返回列表中的最小元素
max(iterable, *, key=None) # 返回列表中的最大元素
num = [12,43,121,34,64,322,46]
print("列表的长度为:", len(num))
print("列表中的最小元素为:", min(num))
print("列表中的最大元素为:", max(num))
【4】、获取指定元素出现的个数
使用列表对象的 count() 方法可以获取指定元素在列表中出现的个数。这里只能进行精确的匹配,即不能是元素值的一部分。count() 方法的返回值就是元素在列表中出现的次数。它的语法格式如下:
listname.count(x)
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha","Mikoto","Sakura"]
print(names.count("Sakura"))
【5】、获取指定元素首次出现的下标
使用列表对象的 index() 方法可以获取指定元素在列表中出现的位置(即索引)。基本语法格式如下:
listname.index(x[, start[, stop]])
names = ["Sakura","Mikoto","Shana","Kikyō","Sakura","Kagome","Moroha","Mikoto","Sakura"]
# 获取指定元素在列表中第一次出现的索引
print(names.index("Sakura"))
# index()的第二个参数表示查找的起始位置
print(names.index("Sakura",5))
# index()的第三个参数表示查找的结束位置
print(names.index("Sakura",3,5))
如果获取列表中没有的元素或抛出如下异常:
ValueError: 'Misaka' is not in list
【6】、反转列表
listname.reverse() # 反转列表
names = ["Sakura","Mikoto","Shana","Sakura","Kikyō","Kagome","Moroha"]
print(names)
# 反转列表
names.reverse()
print(names)
【7】、扩展列表
如果想要把一个列表中的全部元素添加到另一个列表中,我们可以使用列表对象的 extend() 方法实现。
listname.extend(iterable)
names1 = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
names2 = ["Akame","Kurome","Sakura"]
print(names1)
print(names2)
names1.extend(names2)
print(names1)
print(names2)
六、列表解包
解包(解构)就是将列表当中每一个元素都赋值给一个变量。
names = ["Sakura","Mikoto","Shana"]
name1,name2,name3 = names
print(name1)
print(name2)
print(name3)
我们还可以利用列表解包的特性,来实现两个变量的交换。
a = 10
b = 20
print("a = ",a)
print("b = ",b)
# 利用元组的解包,交换两个变量的值
a,b = b,a
print("a = ",a)
print("b = ",b)
在对一个列表进行解包时,变量的数量必须和列表中的元素数量一致,也可以在变量的前面添加一个 * 号,这样变量将会获取列表中剩余的元素。
names = ["Sakura","Mikoto","Shana","Kikyō","Kagome","Moroha"]
name1,name2,*name3 = names
print(name1)
print(name2)
print(name3)
print(type(name3))
不能同时出现两个或以上的 * 变量;
七、对列表进行排序
【1】、使用列表对象的 sort() 方法实现
列表对象提供了 sort() 方法对原列表中的同种类型的元素进行排序。排序后原列表中的元素顺序将发生改变。如果我们需要降序排列,需要传递一个 reverse=True 作为参数。
listname.sort(*, key=None, reverse=False) # 对列表中的元素进行排序,默认是升序排序
names = ["Sakura","Mikoto","Shana","Sakura","Kikyō","Kagome","Moroha"]
# 对列表进行排序,默认是升序排列
names.sort()
print(names)
# 如果需要降序排列,需要传递一个reverse=True作为参数
names.sort(reverse=True)
print(names)
【2】、使用内置的 sorted() 函数实现
sorted() 方法将排序结果以新列表形式返回,不会修改原列表。如果我们需要降序排列,需要传递一个 reverse=True 作为参数。
sorted(iterable, /, *, key=None, reverse=False) # 将排序结果以新列表形式返回,不会修改原列表
names = ["Sakura","Mikoto","Shana","Sakura","Kikyō","Kagome","Moroha"]
# 将排序结果以新列表形式返回,不会修改原列表
new_names = sorted(names)
print(names)
print(new_names)
# 如果需要降序排列,需要传递一个reverse=True作为参数
new_names = sorted(names,reverse=True)
print(names)
print(new_names)
八、列表推导式
列表推导式(list comprehension)将 for 循环和创建新元素的代码合并成一行,并自动追加新元素。要使用这种语法,首先指定一个描述性的列表名,然后指定一个左方括号,并定义一个表达式,用于生成存储到列表中的值。接下来,编写一个 for 循环,用于给变量表达式提供值,再加上右方括号。注意:这里的 for 语句末尾没有冒号。
listname = [表达式 for 变量 in 可迭代对象 if 条件]
num = [value**2 for value in range(1,11)]
print(num)
print(type(num))
num = [value for value in range(1,11) if value % 2 == 0]
print(num)
print(type(num))