Pyhton基础学习系列9——列表

2023-12-28 20:27:33


提示:以下是本篇文章正文内容,下面案例可供参考

一、认识列表

在我们日常处理问题时总会遇到很多需要储存的数据,如果只是一两个可以使用变量。但是当数据量很多时就得使用列表来储存,会更快捷方便。

  • 列表是一个有序且可以更改的容器型数据类型,将[ ]作为作为容器的标志,里面多个数据用逗号隔开:[数据1, 数据2, 数据3, …]

二、列表的特点以及使用方法

1.列表中的元素可以为不同类型的数据

  • 可以是整数、浮点数和复数等,也可以是列表、元组、字典和集合等等

代码如下(示例):

names = ['海贼王', 100, 12.13, True, None, [20,30], '葫芦娃']
print(names)
# ['海贼王', 100, 12.13, True, None, [20, 30], '葫芦娃']

2.列表是可变的(列表支持增删改查)

1.查 - 获取列表中的元素的值

  • 列表[索引]

代码如下(示例):

"""
语法:
列表[索引]          -       获取列表中指定索引对应的元素

说明:
列表      -       需要获取哪个列表中的元素
[]       -       固定写法
索引      -       又叫下标,指的是列表中的元素在列表中的位置信息
                 python中有序的容器中元素的索引有两种:
                 第一种:元素从前往后对应的索引从0开始不断加1
                 第二种:元素从后往前对应的索引从-1开始不断减1
"""

names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官']
print(names)
# ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官']
# 对应的下标和索引值[0,1,2,3,4,5,6]或者[-7,-6,-5,-4,-3,-2,-1]
# 查询柯南
print(names[2],names[-5])
# 柯南 柯南

#这里要注意,如果下标超过整体列表的长度就会报错!
# IndexError: list index out of range

提示:如果是从左往右查询注意第一个数的下标是0开始的,从右往左是-1开始的。

  • 列表.index(元素) - 获取列表中指定元素对应的索引值(返回的索引值是0开始的索引值)不会为负
  • 注意:如果元素有多个,只返回第一个的下标;如果元素不存在会报错!
nums = [10, 89, 20, 30, 10, 56]
print(nums.index(56))
# 5

2.增 - 往列表中添加元素

  • 列表.append(元素) - 在指定列表的最后添加指定的元素
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官']
names.append('毛利小五郎')
print(names)
# ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '毛利小五郎']
  • 列表.insert(下标, 元素) - 在列表中指定的下标对应的元素前面插入新增的元素
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官']
names.append('毛利小五郎')
# 在柯南前面插入伏特加
names.insert(2,'伏特加')
print(names)
# ['琴酒', '灰原哀', '伏特加', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '毛利小五郎']
  • 列表.extend(容器) - 将容器内的所有的元素添加到列表的最后

提示:extend是添加容器里面的每一个元素,就类似于写一个字符串'赤井秀一'它会把里面的4个字一个一个的添加进去,而append是直接添加这一整个字符串。

names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官']
names.extend('赤井秀一')
print(names)
# ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '赤', '井', '秀', '一']

3.删 - 删除列表中的某一个元素

  • del 列表[索引] - 删除列表中指定索引对应的元素
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官','毛利小五郎']
del names[-1]
print(names) 
# ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官']
  • 列表.remove(元素) - 删除列表中指定元素(如果元素不存在会报错,如果元素有多个只删最前面的那一个)
names = ['琴酒', '灰原哀', '毛利小五郎','柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官','毛利小五郎']
names.remove('毛利小五郎')
print(names)
# ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '毛利小五郎']
  • 列表.pop() - 取走列表最后一个元素并且返回
  • 列表.pop(下标) - 取走列表中指定下标对应的元素并且返回
  • 注意pop只是可以实现像删除的效果,但其实本质上并没有删除,只是把元素拿走。(可以用变量存起来)
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '毛利小五郎']
names1 = names.pop()
names2 = names.pop(0)
print(names)
# ['灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官']
print(names1,names2)
# 毛利小五郎 琴酒

4.改 - 修改列表中元素为指定的值

  • 列表[下标] = 值
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '毛利小五郎']
names[-1] = '沉睡的小五郎'
print(names)
# ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '沉睡的小五郎']

三、列表的切片操作

1.切片的完整写法

  • 获取列表中的部分元素
  • 注意:列表切片的结果是列表!
  • 完整语法:列表[开始下标: 结束下标: 步长]
  • 提示:如果取元素的操作方向和步长方向不一致最后返回的结果一定是空列表[ ]。
a.如何确定切片的结果
第一步:确定结果是否为空 -> 看从开始下标到结束下标的方向和步长的方向是否一致。(步长为正表示从前往后取,步长为负表示从后往前取)
第二步:确定有效范围  -> 开始下标对应的元素取得到,结束下标对应的元素取不到
第三步:根据步长在有效范围内获取元素  -> 从开始下标开始取,步长绝对值为1就一个一个地取,步长绝对值为2就取一个跳过一个再取一个...

b.如何写切片的代码
开始下标  -  目标元素中第一个元素对应的下标
结束下标  -  目标元素中最后一个元素后面或者前面那个元素的下标。(后面还是前面看方向(步长是正还是负))
步长  -  由方向决定符号(正负),获取方式决定绝对值(一个一个地取绝对值为1,取1个跳1个再取一个绝对值为2...)
"""
# 简单来说就是如果要取列表多个值,就找到开始的元素下标,结束的元素下标根据步长正负判断加一个还是减一个
# 从左往右取步长一定为正,从右往左取一定为负。
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '毛利小五郎']
# 取从毛利小五郎(下标-1或者7)到毛利兰的元素(3或者-5),因为步长为负所以结束的元素毛利兰的下标要减1(2或者-6)
print(names[-1:-6:-1])
print(names[7:2:-1])
#['毛利小五郎', '目暮警官', '阿笠博士', '贝尔摩德', '毛利兰']
#['毛利小五郎', '目暮警官', '阿笠博士', '贝尔摩德', '毛利兰']

# 方向不一样返回空列表
print(names[1:-1:-1])
# []

2.切片的省略写法

  • 步长不写时默认为1
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '毛利小五郎']
print(names[1:4])
# ['灰原哀', '柯南', '毛利兰']
  • 开始下标和结束下标不写默认从头开始,取元素的方向根据步长确定
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '毛利小五郎']
print(names[:5])
# 因为默认值为1所以从左往右取
# ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德']

print(names[3::-1])
# ['毛利兰', '柯南', '灰原哀', '琴酒']
# 因为步长为-1所以从右往左取

# 把列表反过来取
print(names[::-1])
# ['毛利小五郎', '目暮警官', '阿笠博士', '贝尔摩德', '毛利兰', '柯南', '灰原哀', '琴酒']

四、列表的遍历

1.直接遍历

  • 直接使用for循环会一个一个的取到列表中的值
"""
方法1: - 直接遍历列表
for 变量 in 列表:
    循环体(变量依次获取到的就是列表中的每个元素)
"""
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德']
for i in names:
    print('i:',i)
# i: 琴酒
# i: 灰原哀
# i: 柯南
# i: 毛利兰
# i: 贝尔摩德

2.下标遍历

  • 使用range函数从0开始循环到列表长度结束,取出列表的每个元素以及他的索引值
"""
方法2:- 通过遍历下标来遍历列表
for 变量 in range(len(列表)):
    循环体(变量依次取到到的是列表中每个元素的下标)
补充: len(列表)  - 返回列表长度(列表中元素的个数)
"""
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德']
for index in range(len(names)):
    print(index, names[index])
# 0 琴酒
# 1 灰原哀
# 2 柯南
# 3 毛利兰
# 4 贝尔摩德

3.enumerate

enumerate函数在for循环中先定义两个变量index(下标),item(元素)可以直接取出元素和索引值

"""
方法3:
for 变量1, 变量2 in enumerate(列表):
    循环体(变量1依次获取列表中每个元素下标,变量2依次获取列表中的每个元素)
"""
names = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德']
for index, item in enumerate(names):
    print(index, item)
# 0 琴酒
# 1 灰原哀
# 2 柯南
# 3 毛利兰
# 4 贝尔摩德   

# 这里其实只是对列表做了一个转换改成了以下的形式。
names = [(0,'琴酒'),(1, '灰原哀'),(2, '柯南'), (3,'毛利兰'),(4, '贝尔摩德')]

五、列表的相关操作

1.列表支持+、*操作

  • 列表1 + 列表2 - 将两个列表合并成一个新的列表
names1 = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德']
names2 = ['阿笠博士', '目暮警官', '毛利小五郎']
print(names1 + names2)
# ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官', '毛利小五郎']
  • 列表 * N 或者 N * 列表 - 将列表中的元素重复N次产生一个新的列表
names1 = ['柯南', '毛利兰']
print(2 * names1)
# ['柯南', '毛利兰', '柯南', '毛利兰']
print(names1 * 2)
# ['柯南', '毛利兰', '柯南', '毛利兰']

# 这里需要注意如果乘0的话是空列表
print(names1 * 0)
# []
# 乘1的话是创建一个和原列表里面元素一样的新列表
print(names1 * 1)
# ['柯南', '毛利兰']

2.列表支持比较运算:==、!=、>、<、>=、<=

  • 比较相等(列表可以和任意数据比较是否相等)
names1 = ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德']
nums1 = [10, 20, 30, 100]
print(nums1 == names1)
# False
print(nums1 == [10, 20, 30, 100])
# True
print(names1 == ['琴酒', '灰原哀', '柯南', '毛利兰', '贝尔摩德'])
# True
  • 比较大小(只能两个列表比较大小):>、<、>=、<=
  • 两个列表比较大小比较的是第一对不相等的元素大小。(其中列表中第一对的元素数据类型必须一致,不然会报错)
# 如果比较的类型不是两个列表或者其中第一对元素类型不同都会报类型错误
# TypeError: '>' not supported between instances of 'int' and 'str'
# 左边列表的第一个元素小于右边的第一个元素(10<20)
print([10, 20, 30] > [20, 20, 30]) # Flase
# 左边列表第一个元素和右边列表第一个元素相等所以比较左右两边列表的第二个元素(30>20)
print([10, 30, 30] > [10, 20, 30]) # True
# 只要两个列表中第一个元素数据类型一样就能比较,字符串的比较是根据unicode编码表比较大小的,后面讲字符串时会详细说
print(['99', 20, 30] > ['100', 'abc'])
# True

3.in 和 not in 判断列表中是否存在相应元素

  • 数据 in 列表 - 判断列表中是否存在指定数据对应的元素
  • 数据 not in 列表 - 判断列表中是否不存在指定数据对应的元素
nums1 = [10, 20, 30]
# 判断10和20是否存在
print(10 and 20 in nums1) # True
# 判断10是否不存在
print(10 not in nums1) # Flase

4.列表地址的判断

  • is - 判断地址是否相同(判断两个数据在内存中的地址是否相同)
  • 只要是涉及到的新建了一个列表的操作,都是表面上两个列表一样,但实际不是同一个列表
# 两个列表里面内容一样但是地址不相同
list1 = [20, 30]
list2 = [20, 30]
print(id(list1), id(list2))
# 18947584 18947648
# 这样赋值会让list1和list3关联起来,地址一样内容一样,任何一个列表进行修改另一个列表也会修改。
list3 = list1
print(id(list3))
# 18947584
print(list1 is list3) # True
print(list1 is list2) # Flase

要搞清python底层的存储逻辑,然后根据遇到的问题选择赋值的方法,python保存数据的底层逻辑。

六、列表容器的相关函数

1.sum求和

  • sum - 求列表中所有元素的和(求数值和)
scores = [89, 45, 88, 90, 91, 40, 72, 82, 87]
print(sum(scores))
# 684

2. max(最大值)、min(最小值)

  • max - 求列表中最大的元素
  • min - 求列表中最小的元素
scores = [89, 45, 88, 90, 91, 40, 72, 82, 87]
print(max(scores)) # 91
print(min(scores)) # 40

3.sorted排序

  • sorted(列表) - 将列表中的元素升序排序(从小到大),产生一个新的列表
  • sorted(列表, reverse=True) - 将列表中的元素降序排序(从大到小),产生一个新的列表
scores = [89, 45, 88, 90, 91, 40, 72, 82, 87]
print(sorted(scores))
# [40, 45, 72, 82, 87, 88, 89, 90, 91]
print(sorted(scores,reverse=True))
# [91, 90, 89, 88, 87, 82, 72, 45, 40]
# 注意这里是直接新建了一个列表而不是在原有的列表进行操作

4.len统计长度(统计总共元素的个数)

  • len(列表) - 获取列表中元素的个数
scores = [89, 45, 88, 90, 91, 40, 72, 82, 87]
print(len(scores))
# 9

5.list转换数据类型

  • list(数据) - 将指定数据转换成列表。(所有的容器都可以转换成列表,转换的时候直接将容器中的元素作为列表的元素)
print(list('abc'))      # ['a', 'b', 'c']
print(list(range(10, 16)))      # [10, 11, 12, 13, 14, 15]

七、列表的相关方法

1.clear() - 清空列表

  • 列表.clear() - 清空列表中所有元素
names = ['琴酒', '灰原哀', '毛利小五郎','柯南', '毛利兰', '贝尔摩德', '阿笠博士', '目暮警官','毛利小五郎']
print(names.clear())
# None

2.copy() - 复制指定列表

  • 列表.copy() - 复制一个和原列表一模一样的新列表出来。
# 实现列表拷贝的方法:列表.copy()、列表[:](切片操作)、列表*1、列表+[]
# 这些方法复制出来的地址和原列表地址都是不同的
list1 = [10, 20, 30, 40]
list2 = list1.copy()
list3 = list1+[]
list4 = list1[::-1]

3.count(数据) - 统计个数

  • 列表.count(数据) - 统计列表中指定数据的个数
list1 = [10, 10, 30, 30, 10, 10, 30, 10]
print(list1.count(10)) # 5
print(list1.count(30)) # 3
print(list1.count(1)) # 0
# 如果列表中没有指定的数据统计的个数就是0个

4.reverse() - 将列表排序(从大到小)

  • 列表.reverse() - 将列表从大到小排列
# 不会创建新的列表,在原有的列表中直接进行降序操作
nums = [10, 40, 30, 90]
nums.reverse()
print(nums)
# [90, 30, 40, 10]

5.sort() - 将列表排序

  • 列表.sort() - 将列表中的元素从小到大排序
  • 列表.sort(reverse=True) - 将列表中的元素从大到小排序
# 不会创建新列表在原列表中直接操作
scores = [89, 45, 88, 90, 91, 40, 72, 82, 87]
scores.sort()
print(scores)       # [40, 45, 72, 82, 87, 88, 89, 90, 91]
scores.sort(reverse=True)
print(scores)       # [91, 90, 89, 88, 87, 82, 72, 45, 40]

八、列表推导式

1.基础语法没有if

  • 一种创建列表的表达式,代码全部写在一行里面
  • [表达式 for 变量 in 容器] - 表达式里面只要是有结果的任何式子都行
"""
语法:
[表达式 for 变量 in 容器]
原理:让变量去容器中取值,一个一个地,取完为止,每取一个值就计算一次表达式的结果,并且将结果作为列表中的一个元素
"""
print([x for x in range(0,21,2)])
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
print([x + 1 for x in range(0,21,2)])
# [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]

2.加入if判断语句

  • [表达式 for 变量 in 容器 if 条件语句] - 循环判断条件语句,如果为真则将表达式中的结果作为列表中的一个元素
"""
语法:
[表达式 for 变量 in 容器 if 条件语句]
原理:让变量去容器中取值,一个一个地取,取完为止,每取一个值就判断一次条件是否成立,如果成立就计算表达式的结果作为列表中的一个元素
"""
# 练习:利用列表推导式提取列表中所有的偶数
nums = [52, 96, 60, 10, 79, 37, 0, 90]
print([x for x in nums if x % 2 == 0])
#  [52, 96,  60, 10, 0, 90]

总结

认识掌握列表只需要看着一篇就够了,列表是一个有序且可以更改的容器型数据类型,将[ ]作为容器的标志,支持索引操作,可以进行增删改查,当需要同时取很多元素时可以进行切片操作,还有很多观关于列表的基本操作。

文章来源:https://blog.csdn.net/qq_49771146/article/details/135204427
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。