Python基础语法系列9-列表详解

列表(list)

序列是Python中最基本的数据结构。Python有6个序列的内置类型,但最常见的是列表和元组。序列都可以进行的操作包括索引,切片,加,乘,检查成员。此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。列表是最常用的Python数据类型,其数据类型名是:list。

1 列表的创建

列表对应的值是一个方括号内用逗号将多个数据隔开。列表的数据项(元素)不需要具有相同的类型。

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:

languages = ['Python', 'C', 'Java', 'C#', 'php']
scores = [98, 78, 90, 23]
messages = []		# messages是空列表
# 注意: 列表名通常用复数

2 列表的索引

序列中的每个元素都分配了两个数字来表示它的位置,或索引。这两个数字一个为正,一个为负。正索引值第一个是0,第二个是1,依此类推;负索引值倒数第一个是-1,倒数第二个是-2,依此类推。(索引有的时候也叫下标)

例如,在列表 [10, 20, 30] 中有3个元素分别是10、20、30,这三个元素每个元素都有两个索引值。10对应的索引值是0和-3, 20对应的索引值是1和-2,30对应的索引值是2和-1。

3 列表基本操作

3.1 列表的长度

列表的长度指的是列表中元素的个数,Python提供了len函数,可以获取任何序列的长度。

实例如下:

languages = ['Python', 'C', 'Java', 'C#', 'php']
print('languages的长度:',len(languages))

以上实例输出结果:

languages的长度: 5
3.2 列表的访问和切片

使用下标索引来访问列表中的值,其语法为: 列表[下标] - 获取指定下标对应的元素

实例如下:

list1 = ['Python', 1997, 2020, '武汉']

print('list1[1]:', list1[1])
print('list1[-2]:', list1[-2])

以上实例输出结果:

list1[1]: 1997
list1[-2]: 2020

在通过下标获取单个元素的时候要注意,这儿的下标不能越界(正的下标值:0 ~ 长度-1;负的下标值:-1 ~ -长度),如果越界程序会报错,实例如下:

list1 = ['Python', 1997, 2020, '武汉']

print(list1[4])

输出结果:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

同样,我们也可以使用方括号的形式截取字符(又叫’切片’),其语法为:列表[下标1:下标2:步长] - 从下标1开始获取每次下标值增加步长,知道下标2对应的字符前为止。 这儿的下标1、下标2和步长都可以省略。

实例如下:

list2 = [1, 2, 3, 4, 5, 6, 7 ]

print('list2[1:6:2]:', list2[1:6:2])
print('list2[6:2:-2]:', list2[6:2:-2])

# (1)省略步长:列表[下标1:下标2]	-	省略步长相当于步长为1
print('list2[1:6]:', list2[1:6])

# (2)省略下标1:列表[:下标2:步长]	-	步长为正,从第一个元素开始往后获取;步长为负,从最后一个开始往前获取
print('list2[:5:2]:', list2[:5:2])
print('list2[:5]:', list2[:5])

# (3)省略下标2:列表[下标1::步长]	-	步长为正,从前获取到最后一个元素;步长为负,从后获取到第一个元素
print('list2[3::-2]:', list2[1::2])
print('list2[3:]:', list2[3:])

# (4)一起省
print('list2[:]:', list2[:])
print('list2[::-1]:', list2[::-1])

输出结果:

list2[1:6:2]: [2, 4, 6]
list2[6:2:-2]: [7, 5]
    
list2[1:6]: [2, 3, 4, 5, 6]
    
list2[:5:2]: [1, 3, 5]
list2[:5]: [1, 2, 3, 4, 5]
    
list2[3::-2]: [2, 4, 6]
list2[3:]: [4, 5, 6, 7]
    
list2[:]: [1, 2, 3, 4, 5, 6, 7]
list2[::-1]: [7, 6, 5, 4, 3, 2, 1]

切片的时候要注意,如果步长为正,表示从前往后取,这个时候下标1对应的元素必须在下标2对应的元素的前面否则结果是[];反之,如果步长为负,表示从后往前取,这个时候下标1对应的元素必须在下标2对应的元素的后面,否则结果是[]。实例如下:

list2 = [1, 2, 3, 4, 5, 6, 7 ]

print('list2[-1:2]:', list2[-1:2])
print('list2[1:-1:-1]:', list2[1:-1:-1])

输出结果:

list2[-1:2]: []
list2[1:-1:-1]: []
3.3 列表的拼接

列表支持 + 运算,用于组合列表,其用法为:列表1 + 列表2 - 组合列表1和列表2产生一个新的列表

其实例如下:

list1 = ['电影', '电视剧', '小品']
list2 = ['程序员', '行政', '测试']

print(list1 + list2)

输出结果:

['电影', '电视剧', '小品', '程序员', '行政', '测试']
3.4 列表的重复

列表支持 * 运算,用于重复列表,其用法为:列表 * N 或 N * 列表 - 列表重复N次产生一个新的列表

其实例如下:

list1 = ['电影', '电视剧', '小品']

print(list1 * 3)

输出结果:

['电影', '电视剧', '小品', '电影', '电视剧', '小品', '电影', '电视剧', '小品']
3.5 列表的成员

列表可以通过 in 和 not in 操作,来判断列表中是否存在指定元素,其用法为:x in 列表 - 判断x是否是列表中的元素

实例如下:

list1 = ['电影', '电视剧', '小品']

print('电影' in list1)
print('电影' not in list1)

输出结果:

True
False

4 列表的遍历

遍历列表指的是将列表中的元素一个一个的全部访问一遍。遍历列表分两种方式,第一种:直接通过for循环遍历列表中的元素;第二种:通过遍历列表中元素的下标间接遍历列表。

第一种遍历方式,实例如下:

languages = ['Python', 'C', 'Java', 'C#', 'php']
for x in languages:
    print('x:', x)

输出结果:

x: Python
x: C
x: Java
x: C#
x: php

第二种遍历方式,实例如下:

languages = ['Python', 'C', 'Java', 'C#', 'php']

# 这儿也可以使用while循环将列表元素的下标遍历出来;而且还可以遍历负的下标值
for x in range(len(languages)):
    print('x:', x, end=',')
    print('languages[x]:', languages[x])

输出结果:

x: 0, languages[x]: Python
x: 1, languages[x]: C
x: 2, languages[x]: Java
x: 3, languages[x]: C#
x: 4, languages[x]: php

5 列表的元素操作

5.1 增加元素

列表中增加元素的方式有以下几种:

  • 列表.append(元素) - 在列表的默认添加指定元素
  • 列表.insert(下标, 元素) - 在列表指定下标前插入指定元素
  • 列表.extend(序列) - 将序列中的元素全部添加到列表的后面

使用实例如下:

list1 = [1, 2, 3]
list2 = [10, 20, 30]
list3 = [100, 200, 300]

list1.append('Hi')
list2.insert(1, 'Hi')
list3.extend(['hi', 'python'])

print('list1:', list1)
print('list2:', list2)
print('list3:', list3)

输出结果:

list1: [1, 2, 3, 'Hi']
list2: [10, 'Hi', 20, 30]
list3: [100, 200, 300, 'hi', 'python']
5.2 删除元素

列表中元素的删除的方式有以下几种:

  • del 列表[下标] - 删除列表中指定下标对应的元素(下标不能越界,否则会报错)
  • 列表.remove(元素) - 删除列表中第一个指定元素(如果元素不存在会报错,如果有多个只删除第一个)
  • 列表.pop() - 将列表中的最后一个元素取出并且返回
  • 列表.pop(下标) - 将列表中指定下标对应的元素取出并返回(下标不能越界)
  • 列表.clear() - 清空列表
films = ['一人之下', '柯南', '一拳超人', '不良人', '死亡笔记', '秦时明月', '海贼王']
del films[2]
print('del删除:', films)

nums = [10, 2, 45, 2, 9]
nums.remove(2)
print('remove删除:', nums)

nums = [10, 2, 45, 2, 9]
del_num = nums.pop()
print('pop删除:', nums)
print('被删除的元素:', del_num)

nums = [10, 2, 45, 2, 9, -2]
del_num = nums.pop(-2)
print('pop删除2:', nums)
print('被删除的元素2:', del_num)

nums = [10, 2, 45, 2, 9, -2]
nums.clear()
print('clear清空:', nums)

结果:

del删除: ['一人之下', '柯南', '不良人', '死亡笔记', '秦时明月', '海贼王']
remove删除: [10, 45, 2, 9]
pop删除: [10, 2, 45, 2]
被删除的元素: 9
pop删除2: [10, 2, 45, 2, -2]
被删除的元素2: 9
clear清空: []

列表元素的删除要特别注意遍历删除(删除列表中所有或者部分满足条件的元素),举个例子:用一个列表保存多个学生的成绩,现在要求删除所有低于60分的元素: scores = [90, 78, 56, 30, 67, 89, 92, 30, 56, 80, 54]。可以尝试去写写这个代码。

5.3 修改元素

列表修改元素的值的语法主要就一种:

  • 列表[下标] = 值 - 将列表指定下标对应的元素修改成指定的值(下标不能越界)
nums = [10, 2, 45, 2, 9, -2]
nums[0] = 100
print(nums)

结果:

[100, 2, 45, 2, 9, -2]

6 嵌套列表

嵌套列表即在列表中创建其他列表,例如:

a = [1, 2, 3]
b = ['a', 'b', 'c']

# 这儿的x就是一个嵌套列表
x = [a, b]	
print('x:', x)
print('x[0]:', x[0])
print('x[0][x1]:', x[0][1])

输出结果:

x: [[1, 2, 3], ['a', 'b', 'c']]
x[0]: [1, 2, 3]
x[0][x1]: 2

7 列表相关操作

7.1 加法和乘法运算

Python中的列表支持加法运算符和乘法运算符:

  • 列表1 + 列表2 - 两个列表合并产生一个新的列表
  • 列表 * N (N * 列表) - 指定列表中的元素重复 N 次产生一个新的列表
list1 = [1, 2, 3]
list2 = ['张三', '李四']
new_list = list1 + list2
print('list1+list2:', new_list)

new_list = list1 * 2
print('list1 * 2:', new_list)

结果:

list1+list2: [1, 2, 3, '张三', '李四']
list1 * 2: [1, 2, 3, 1, 2, 3]
7.2 in 和 not in

in 和 not in 可以用来判断列表中是否有指定元素:

  • 元素 in 列表 - 列表中是否存在 指定元素,存在返回 True, 否则返回 False
  • 元素 not in 列表 - 列表中是否不存在指定元素,存在返回 False 否则返回 True
names = ['小明', '小花', '小红', '张三']
print('小红' in names)      # True
print('李四' in names)      # False
print(['小明'] in names)    # False
7.3 序列操作相关函数
  1. len - 获取序列的长度(序列中元素的个数)
  2. max、min - 获取最大/最小元素
  3. sum - 求序列中所有元素的和
  4. sorted - 对序列中的元素进行排序产生一个新的列表
  5. list - 将其他类型的数据转换成列表
# 1)len(序列)  - 获取序列的长度(元素的个数)
print(len([1, 2, 3]))   # 3
print(len('hello'))   # 5

# 2) max/min
# max(序列)/min(序列)  -> 获取序列中元素的最大值/最小值
# 序列的要求:a.序列中所有的元素的类型一致(数字看成一种类型)  b.元素本身支持比较大小
scores = [23, 89, 89, 78, 90, 91, 12]
print(max(scores))   # 91
print(min(scores))   # 12

# 3) sum
# sum(数字序列)  -> 求序列中所有元素的和
scores = [1, 2, 3]
print(sum(scores))
print(sum(range(101)))

# 4) sorted
# sorted(序列)  -> 对序列中的元素升序排序(从小到大),并且返回一个列表
# sorted(序列, reverse=True)  -> 对序列中的元素升序排序(从小到大),并且返回一个列表
scores = [23, 89, 89, 78, 90, 91, 12]
new_scores = sorted(scores)
print(new_scores)	# [12, 23, 78, 89, 89, 90, 91]

scores = [23, 89, 89, 78, 90, 91, 12]
new_scores = sorted(scores, reverse=True)
print(new_scores)	# [91, 90, 89, 89, 78, 23, 12]


# 5) list
# list(数据)   -> 将指定的数据转换成列表; 数据必须是序列(所有的序列都可以转换成列表)
# print(list(100))   # TypeError: 'int' object is not iterable
print(list('hello'))   # ['h', 'e', 'l', 'l', 'o']
print(list(range(10, 15)))   # [10, 11, 12, 13, 14]
7.4 列表相关的其他方法
  • 列表.count(元素) - 统计指定元素在列表中个数
  • 列表.index(元素) - 获取指定元素在列表中的下标(如果元素不存在会报错;如果元素有多个只返回第一个的下标)
  • 列表.reverse() - 将列表中的元素倒序
  • 列表.copy() - 拷贝列表产生一个新的列表
  • 列表.sort() - 对列表中的元素升序排序
names = ['赵云', '小乔', '貂蝉', '吕布', '诸葛亮', '司马懿', '小乔']
# 1.列表.count(元素)  ->  统计列表中指定元素的个数
print(names.count('赵云'))    # 1
print(names.count('大乔'))    # 0
print(names.count('小乔'))    # 2

# 2.列表.index(元素)   ->   获取指定元素在列表中的下标(下标值是0 ~ 长度-1)
# a.如果元素不存在会报错
# b.如果元素有多个
nums = [10, 3, 50, 3, 90]
# print(nums.index(100))    # ValueError: 100 is not in list
print(nums.index(3))   # 1
print(nums.index(50))  # 2


# 3.列表.reverse()   ->  将原来的列表倒序(反过来)
nums = [1, 9, 3]
nums.reverse()
print(nums)   # [3, 9, 1]

nums = [1, 9, 3]
new_nums = nums[::-1]
print(nums, new_nums)    # [1, 9, 3] [3, 9, 1]

# 4.列表.clear()   -> 清空列表
nums = [10, 3, 50, 3, 90]
nums.clear()
print(nums)

# 注意: 清空列表用clear, 而不是直接赋值为[]
nums = [10, 3, 50, 3, 90]
nums = []
print(nums)

# 5.列表.copy()  -> 复制列表中的元素,产生一个新的列表, 将新列表的地址返回。赋值后两个相互不影响
# 和列表[:]的功能一模一样, 都属于浅拷贝
heros = ['后裔', '甄姬', '凯', '庄周', '蔡文姬']
# 直接赋值,赋值后两个列表相互影响
heros2 = heros
print(heros2)   # ['后裔', '甄姬', '凯', '庄周', '蔡文姬']
del heros2[-1]
print(heros2)   # ['后裔', '甄姬', '凯', '庄周']
print(heros)    # ['后裔', '甄姬', '凯', '庄周']


heros = ['后裔', '甄姬', '凯', '庄周', '蔡文姬']
heros2 = heros.copy()
print(heros2)   # ['后裔', '甄姬', '凯', '庄周', '蔡文姬']
del heros2[-1]
print(heros2)   # ['后裔', '甄姬', '凯', '庄周']
print(heros)    # ['后裔', '甄姬', '凯', '庄周', '蔡文姬']


# 6. 列表.sort()  ->  将列表中的元素从小到大排序(直接修改列表元素的顺序,不会产生新的列表)
#    列表.sort(reverse=True)   -> 将列表中的元素从大到小排序(直接修改列表元素的顺序,不会产生新的列表)
#    列表.sort(reverse=True)  相当于  列表.sort(); 列表.reverse()
scores = [89, 78, 90, 56, 76, 30]
scores.sort()
print(scores)

scores = [89, 78, 90, 56, 76, 30]
scores.sort(reverse=True)
print(scores)
发布了40 篇原创文章 · 获赞 11 · 访问量 1464

猜你喜欢

转载自blog.csdn.net/yuting209/article/details/105206406