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))
posted @ 2024-09-16 18:32  星光映梦  阅读(6)  评论(0编辑  收藏  举报