写点什么

挑战 30 天学完 Python:Day5 数据类型 - 列表 list

作者:MegaQi
  • 2022-10-16
    上海
  • 本文字数:7210 字

    阅读完需:约 1 分钟

挑战30天学完Python:Day5 数据类型 - 列表list

🎉 本系列为 Python 基础学习,原稿来源于 github 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过 30 天完成正儿八经的系统化实践。此系列适合零基础同学,会简单用但又没有系统学习的使用者。总之如果你想提升自己的 Python 技能,欢迎加入《挑战 30 天学完 Python》。

作者:大奇 MegaQi | Info 签约作者 ,专注测试开发技术实战干货分享,欢迎访问主页长期关注。

列表 Lists

在 Python 中有四种集合数据类型:

  • 列表 list:一个有序并且可修改的(可变)集合,允许有重复元素。

  • 元组 tuple:一个有序但不能改变或者修改的(不可变)集合,允许有重复元素。

  • 集合 set:一个无序,无索引且不可修改的集合。但可以向 set 中添加新的元素。不允许有重复元素。

  • 字典 dict:一个无序集合,可改变可修改,且有索引,没有重复元素。


本篇要学的 **列表 **是不同数据类型的集合,它们是有序和可修改的(可变的)。列表可以为空,也可以有不同的数据类型项。

如何创建 list

Python 中创建列表集有两种方式:

  • 使用 list 内置函数

# 使用方法,变量名lst并不是错别字,避免使用list=list(),因为list是python中关键字lst = list() 
# 举例创建没有任何项的空listempty_list = list()print(len(empty_list)) # 0print(empty_list) # []
复制代码


  • 使用方括号 []

# 使用方法lst = []
# 声明一个空的listempty_list = [] print(len(empty_list)) # 0print(empty_list) # []
复制代码


如果一个列表带有初始值,我们可以使用 len() 方法计算列表的长度。

# 定义一些列表变量并出示化一些相同类值fruits = ['banana', 'orange', 'mango', 'lemon']vegetables = ['Tomato', 'Potato', 'Cabbage','Onion', 'Carrot']web_techs = ['HTML', 'CSS', 'JS', 'React','Redux', 'Node', 'MongDB']
# 打印列表长度print('水果:', fruits)print('水果数量:', len(fruits))print('蔬菜:', vegetables)print('蔬菜数量:', len(vegetables))print('Web technologies:', web_techs)print('Number of web technologies:', len(web_techs))
# 结果输出水果: ['banana', 'orange', 'mango', 'lemon']水果数量: 4蔬菜: ['Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']蔬菜数量: 5Web technologies: ['HTML', 'CSS', 'JS', 'React', 'Redux', 'Node', 'MongDB']Number of web technologies: 7
复制代码


列表中的元素可以包含数据类型

# 包含字符,数字,布尔,字典不同类型数据lst = ['生活', 18, True, {'country':'中国', 'city':'ShangHai'}]
复制代码


索引访问列表项

正索引

我们访问列表中的项使用索引,下角标从 0 开始。下图很清晰的展示索引所代表的项,最后一个为数组长度减 1。


fruits = ['banana', 'orange', 'mango', 'lemon']# 访问水果数组集的第一项first_fruit = fruits[0]print(first_fruit)      # banana
# 访问水果数组集的第二项second_fruit = fruits[1]print(second_fruit) # orange
# 访问第最后一项:正向last_fruit = fruits[3]print(last_fruit) # lemon
last_index = len(fruits) - 1last_fruit = fruits[last_index]
复制代码


负索引

负索引表示从末尾开始,-1 表示最后一项,-2 表示倒数第二项。<br />



fruits = ['banana', 'orange', 'mango', 'lemon']
first_fruit = fruits[-4]last_fruit = fruits[-1]second_last = fruits[-2]
print(first_fruit) # bananaprint(last_fruit) # lemonprint(second_last) # mango
复制代码

拆包列表项

列表可以通过赋值语句进行快速拆包。简单来讲就是将集合中的多个元素同时赋值给多个变量。其中*变量可以接受 1 到多个。如下边的例子前三项按顺序拆包分别赋值给了变量,剩余项全部给了最后一个动态变量。

lst = ['item','item2','item3', 'item4', 'item5']first_item, second_item, third_item, *rest = lstprint(first_item)     # item1print(second_item)    # item2print(third_item)     # item3print(rest)           # ['item4', 'item5']
复制代码


具体举两个例子:

# 第一个例子:水果拆分前三项给1,2,3变量,剩余全部给restfruits = ['banana', 'orange', 'mango', 'lemon','lime','apple']first_fruit, second_fruit, third_fruit, *rest = fruitsprint(first_fruit)     # bananaprint(second_fruit)    # orangeprint(third_fruit)     # mangoprint(rest)           # ['lemon','lime','apple']
# 第二个例子:前三项和最后一项分别给了对应变量,剩余所有中间组成一个集合给到restfirst, second, third, *rest, tenth = [1,2,3,4,5,6,7,8,9,10]print(first) # 1print(second) # 2print(third) # 3print(rest) # [4,5,6,7,8,9]print(tenth) # 10
复制代码

切片操作列表

正索引:我们可以通过指定开始 start、结束 end 指定索引范围,步指定间隔来返回一个新的列表。默认值 start=0,end=len(列表) -1,step=1。

fruits = ['banana', 'orange', 'mango', 'lemon']# all_fruits 返回所有水果all_fruits = fruits[0:4] print(all_fruits) # ['banana', 'orange', 'mango', 'lemon'] # 此 all_fruits 和上边是同样的结果,切片end不设置表示到最后一个all_fruits = fruits[0:]print(all_fruits)  # ['banana', 'orange', 'mango', 'lemon']
# 它表示不包含index=0和index=3的项orange_and_mango = fruits[1:3]print(orange_and_mango) # ['orange', 'mango']
# 不包含bananaorange_mango_lemon = fruits[1:]print(orange_mango_lemon) # ['orange', 'mango', 'lemon']
# 这里演示了step第三个参数,表示每两个取一个,即隔一个项取值banana_and_lemon = fruits[::2] print(banana_and_lemon) # ['banana', 'mango']
复制代码


负索引:同样我们可以通过负索引来对列表进行切片获取新的 list 操作。

fruits = ['banana', 'orange', 'mango', 'lemon']# 返回水果的所有项all_fruits = fruits[-4:]  # ['banana', 'orange', 'mango', 'lemon']
# 不包含首尾项,输出:['orange', 'mango']orange_and_mango = fruits[-3:-1]
# 从-3开始到结尾,输出:['orange', 'mango', 'lemon']orange_mango_lemon = fruits[-3:]
# -1步将得到一个方向排序的list ['lemon', 'mango', 'orange', 'banana']reverse_fruits = fruits[::-1]
复制代码

如何修改 list

List 是可变(可修改)的有序项集合,修改的方法是通过列表索引重新赋值。<br />让我们修改水果列表为例:

fruits = ['banana', 'orange', 'mango', 'lemon']fruits[0] = 'avocado'print(fruits)       #  ['avocado', 'orange', 'mango', 'lemon']
fruits[1] = 'apple'print(fruits) # ['avocado', 'apple', 'mango', 'lemon']
last_index = len(fruits) - 1fruits[last_index] = 'lime'print(fruits) # ['avocado', 'apple', 'mango', 'lime']
复制代码

检查 list 项

判断某项是否存在 list 集合中使用 in 操作符。看如下例子:

fruits = ['banana', 'orange', 'mango', 'lemon']
does_exist = 'banana' in fruitsprint(does_exist) # True
does_exist = 'lime' in fruitsprint(does_exist) # False
复制代码

添加项到 list

如果想要向已有的 list 中添加新的项,我们使用append()函数方法。请注意此方法是向末尾追加项。

# 语法# lst = list()# lst.append(item)fruits = ['banana', 'orange', 'mango', 'lemon']fruits.append('apple')print(fruits)           # ['banana', 'orange', 'mango', 'lemon', 'apple']
fruits.append('lime') # ['banana', 'orange', 'mango', 'lemon', 'apple', 'lime']print(fruits)
复制代码

插入项到 list

上边 append 只能末尾追加新项,如果想在 list 某位置插入项,需要使用insert()方法。注意,此方法插入位置后边顺序往右移动。insert 方法有两个参数:_index_索引 和 _item_插入项。

# 语法形式# lst = ['item1', 'item2']# lst.insert(index, item)fruits = ['banana', 'orange', 'mango', 'lemon']fruits.insert(2, 'apple') # 在orange和mango之间插入appleprint(fruits)           # ['banana', 'orange', 'apple', 'mango', 'lemon']
fruits.insert(3, 'lime') # 新的list中在apple后插入新的职limeprint(fruits) # ['banana', 'orange', 'apple', 'lime', 'mango', 'lemon']
复制代码

移除 list 项

Remove

使用 remove() 方法对 list 指定项进行移除。如果移除的项不存在则会报 ValueError 错误。

# 语法形式# lst = ['item1', 'item2']# lst.remove(item)fruits = ['banana', 'orange', 'mango', 'lemon', 'banana']fruits.remove('banana') # 指定移除香蕉banana,如果有多个相同项,移除遇见的第一个print(fruits)  # ['orange', 'mango', 'lemon', 'banana']
fruits.remove('lemon') # 再移除lemonprint(fruits) # ['orange', 'mango', 'banana']
fruits.remove('apple') # 移除不存在的项会报相应错误# Traceback (most recent call last):# File "<stdin>", line 1, in <module># ValueError: list.remove(x): x not in list
复制代码

Pop

方法函数pop()它删除指定的索引(如果没有指定 index 则删除最后一项)。

# 语法形式# lst = ['item1', 'item2']# lst.pop()       # 默认最后一项# lst.pop(index)fruits = ['banana', 'orange', 'mango', 'lemon']fruits.pop()print(fruits)       # ['banana', 'orange', 'mango']
fruits.pop(0)print(fruits) # ['orange', 'mango']
复制代码


这里请你尝试下如果如下两种情况会得到什么样结果:

  • pop 给定一个超出范围的 index

  • 对一个空列表[]使用 pop<a name="XUppA"></a>

Del

此方法del()删除指定的索引。除此之外它还可以用于删除索引范围内的项,也可以完全删除列表。

# 语法形式# lst = ['item1', 'item2']# del lst[index] # 仅删除指定的索引对应项# del lst        # 删除列表变量
# 具体演示例子fruits = ['banana', 'orange', 'mango', 'lemon', 'kiwi', 'lime']del fruits[0] # 删除索引0即列表项bananaprint(fruits) # ['orange', 'mango', 'lemon', 'kiwi', 'lime']
del fruits[1] # 在执行上述删除后新list再删除mongoprint(fruits) # ['orange', 'lemon', 'kiwi', 'lime']
del fruits[1:3] # 删除指定索引区间半开[), 即不包括右index=3的项print(fruits) # ['orange', 'lime']
del fruits # 删除整个列表print(fruits) # 报错: NameError: name 'fruits' is not defined,因为del删除了整个变量
复制代码

拷贝 list

通过 list2=list1 方法可以将一个 list 重新复制给一个新变量。这种方式下 list2 是 list1 的引用,任何在 list2 中的修改都将改变原是原始 list1。但很多情况下,我们不希望改变原 list,而是创建一个不关联的副本。避免上述问题的一种方式就是使用 copy() 方法函数。

# 语法形式# lst = ['item1', 'item2']# lst_copy = lst.copy()
# 具体演示例子fruits = ['banana', 'orange', 'mango', 'lemon']fruits_copy = fruits.copy()print(fruits_copy) # ['banana', 'orange', 'mango', 'lemon']
fruits_copy[0] = 'apple'print(fruits_copy) # ['banana', 'orange', 'mango', 'lemon']print(fruits) # ['apple', 'orange', 'mango', 'lemon']
复制代码

连接 list

在 Python 中可以通过以下方式连接两个或多个列表。

  • 方式一: 加号运算符(+),直接将两个 list 相加返回一个组合列表集合。

# 语法形式# list3 = list1 + list2
# 具体演示例子positive_numbers = [1, 2, 3, 4, 5]zero = [0]negative_numbers = [-5,-4,-3,-2,-1]integers = negative_numbers + zero + positive_numbers # 按相加顺序组合print(integers) # [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
fruits = ['banana', 'orange', 'mango', 'lemon']vegetables = ['Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']fruits_and_vegetables = fruits + vegetablesprint(fruits_and_vegetables ) # # ['banana', 'orange', 'mango', 'lemon', 'Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']
复制代码


  • 方式二:使用 extend() 方法。此方法允许在原有 list 追加一个 list。

# 语法形式# list1 = ['item1', 'item2']# list2 = ['item3', 'item4', 'item5']# list1.extend(list2)
# 具体演示例子num1 = [0, 1, 2, 3]num2= [4, 5, 6]num1.extend(num2)print('Numbers:', num1) # Numbers: [0, 1, 2, 3, 4, 5, 6]
negative_numbers = [-5,-4,-3,-2,-1]positive_numbers = [1, 2, 3,4,5]zero = [0]negative_numbers.extend(zero)negative_numbers.extend(positive_numbers)print('Integers:', negative_numbers) # Integers: [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
fruits = ['banana', 'orange', 'mango', 'lemon']vegetables = ['Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']fruits.extend(vegetables)print('Fruits and vegetables:', fruits ) # Fruits and vegetables: ['banana', 'orange', 'mango', 'lemon', 'Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']
复制代码

计数 list 项

方法 count() 返回一个项在列表中出现的次数。

# 语法使用# lst = ['item1', 'item2']# lst.count(item)
# 实战演示例子fruits = ['banana', 'orange', 'mango', 'lemon']print(fruits.count('orange')) # 1
ages = [22, 19, 24, 25, 26, 24, 25, 24]print(ages.count(24)) # 3
复制代码

查找项索引

方法 index() 返回给定项在 list 的索引。如果找不到返回 ValueError:x is not in list。

# 语法形式# lst = ['item1', 'item2']# lst.index(item)
# 案例fruits = ['banana', 'orange', 'mango', 'lemon']print(fruits.index('orange')) # 1
ages = [22, 19, 24, 25, 26, 24, 25, 24]print(ages.index(24)) # 2, 第一次出现的位置
复制代码

list 项排序

要对列表进行排序,我们使用内置函数 sort() 或 sorted()

  • sort():此排序方法将列表项按升序重新排序,并修改原始列表。如果方法参数 reverse 等于 true,它将按降序排列列表项。

# 语法使用# lst = ['item1', 'item2']# lst.sort()                # 默认升序# lst.sort(reverse=True)    # 指定降序排序
# 例子fruits = ['orange', 'banana', 'mango', 'lemon']fruits.sort()# 按字母排序,打印将输出 ['banana', 'lemon', 'mango', 'orange']print(fruits)
fruits.sort(reverse=True) # 字母降序print(fruits) # ['orange', 'mango', 'lemon', 'banana']
ages = [22, 19, 24, 25, 26, 24, 25, 24]ages.sort() # 数字小到大print(ages) # [19, 22, 24, 24, 24, 25, 25, 26]
ages.sort(reverse=True) # 数字大到小print(ages) # [26, 25, 25, 24, 24, 24, 22, 19]
复制代码


  • sorted():在于在不改变原是列表的情况下返回有序列表。注意使用语法是 list 作为一个参数传给 sorted,而不是 list 的一个属性。

# 直接举例# 正序排序fruits = ['banana', 'orange', 'mango', 'lemon']print(sorted(fruits))   # ['banana', 'lemon', 'mango', 'orange']print(fruits)           # ['banana', 'orange', 'mango', 'lemon']
# 倒叙排序fruits = ['banana', 'orange', 'mango', 'lemon']# 注意这里是倒序后重新赋值给了fruits,所以值顺序发生了变化fruits = sorted(fruits,reverse=True) print(fruits) # ['orange', 'mango', 'lemon', 'banana']
复制代码


🌕 你非常勤奋,你并且取得了很大的成就。你当前完成了第 5 天学习,在完成挑战的路上迈出了 5 步。现在让我们通过练习好好回忆和巩固下在list所学的知识吧。<a name="flikR"></a>

第 5 天练习

练习 1 级

  1. 声明一个空的 list。

  2. 声明一个 list 并初始化 5 项数据。

  3. 计算刚刚声明 list 的长度。

  4. 分别获取第一、中间和最后一个列表项。

  5. 声明一个名为 mixed_data_types 的 list,然后赋予以下不同类型数据:你的姓名,年龄,是否毕业,身高,家庭地址。

  6. 声明 list 变量名为 it_companies 并且初始化一些公司数据 Facebook, Google, Microsoft, Apple, IBM, Oracle and Amazon。

  7. 使用 print() 打印刚刚声明的 it_companies。

  8. 计算打印公司 list 的项的个数。

  9. 分别输出第一、中间和最后公司名。

  10. 任意更改公司 list 中一数据,然后打印出来。

  11. 追加一个新公司到 it_companies。

  12. 再新增公司到 list 中间的位置。

  13. 选择 it_companies 一项非全大写名更改其全部大写。

  14. 使用引号内字符'#;' 将 it_companies 列表数据连接起来。

  15. 搜索一个公司是否存在 it_companies 列表内。

  16. 使用方法 sort() 对其 list 进行排序。

  17. 使用 reverse() 降序排序。

  18. 切片方式获取 it_companies 的前三项。

  19. 切片方式获取 it_companies 的后三项。

  20. 切片方式获取位于列表中间的几项。

  21. 从列表中移除第一个公司。

  22. 从列表中移除中间的一家公司。

  23. 从列表中移除最右一家公司。

  24. 从列表中移除所有公司。

  25. 删除/销毁 it_companies 列表。

  26. 将下边给出的 list 进行合并连接。

front_end = ['HTML', 'CSS', 'JS', 'React', 'Redux']back_end = ['Node','Express', 'MongoDB']
复制代码
  1. 在完成 26 题后,拷贝 copy 这个列表到一新列表变量 full_stack。然后在 Redux 后插入 Python 和 SQL。

练习 2 级

  1. 有如下一个包含 10 名同学年龄的 list,根据要求完成练习。

ages = [19, 22, 19, 24, 20, 25, 26, 24, 25, 24]
复制代码
  • 通过排序然后找出最小和最大年龄;

  • 添加一个更小和更大的年年龄数到 ages 列表中;

  • 找出中位数年龄(中间一项或中间两项除以二);

  • 找出平均年龄(所有项目的总和除以它们的数量);

  • 找出年龄的范围(最大值-最小值)。

  • 比较(min - average)和(max - average)的值,使用abs()方法。


  1. 有列表如:['China', 'Russia', 'USA', 'Finland', 'Sweden', 'Norway', 'Denmark'],现将前三个国家和其他国家拆开。


🎉 CONGRATULATIONS ! 🎉

英文原文:Day5 - List


如喜欢通过“点赞👍收藏❤️关注➕”鼓励作者大奇

文章中如有错误或疑问欢迎指正和交流。

发布于: 刚刚阅读数: 3
用户头像

MegaQi

关注

InfoQ签约作者 |公众号: 大奇测试开发 2018-02-15 加入

分享一些系列测试平台开发教程,也记录一些自己研究的技术,遇到的问题,总之想分享一些干货内容,愿给这个行业贡献微不足道的力量,不断突破不断成长。

评论

发布
暂无评论
挑战30天学完Python:Day5 数据类型 - 列表list_挑战30天学完Python_MegaQi_InfoQ写作社区