写点什么

从基础掌握 Python 的列表和元组

作者:虫无涯
  • 2023-02-28
    陕西
  • 本文字数:4209 字

    阅读完需:约 14 分钟

1 序列

  • 序列是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。

  • Python 序列结构主要有列表、元组、集合、字典和字符串;

1.1 索引

  • 序列中,每个元素都有属于自己的编号(索引)。从起始元素开始,索引值从 0 开始递增。也可以为负数即从右到左计数;

  • 也可以为负数即从右到左计数;


name = ["zhangsan", "lisi", "wangwu"]print(name[0])print(name[2])print(name[-1])
复制代码


结果:


zhangsanwangwuwangwu
复制代码

1.2 切片

  • 语法:name[start : end : step]


name:表示序列名称;start:切片开始位置,默认为 0end:切片截止位置,默认为序列的长度 step:切片步长,默认为 1


name = ["火影", "鸣人", "佐助", "小樱"]num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(name[0:2])print(name[0:2:1])print(num[0:9:2])print(name[:])print(name)
复制代码


结果:


['火影', '鸣人']['火影', '鸣人'][1, 3, 5, 7, 9]['火影', '鸣人', '佐助', '小樱']['火影', '鸣人', '佐助', '小樱']
复制代码

1.3 序列相加

  • 两个序列类型必须相同

  • 相加即将两个序列进行连接

  • 使用 “ + ” 即可

num_str = ["1", "2", "3", "4", "5"]num = [1, 2, 3, 4, 5]name_str = ["路飞", "索洛", "乔巴", "山治", "娜美"]
num_new = num + num_strprint(num_new)name_str_new = name_str + num_strprint(name_str_new)
复制代码


结果:


[1, 2, 3, 4, 5, '1', '2', '3', '4', '5']['路飞', '索洛', '乔巴', '山治', '娜美', '1', '2', '3', '4', '5']
复制代码


  • 不同类型的序列不能相加,比如列表和元组


num_str = ["1", "2", "3", "4", "5"]num = (1, 2, 3, 4, 5)
num_new = num + num_strprint(num_new)
复制代码


结果:


Traceback (most recent call last):  File "F:/python_study/main.py", line 6, in <module>    num_new = num + num_strTypeError: can only concatenate tuple (not "list") to tuple
复制代码

1.4 乘法

  • 使用数字 n 乘以一个序列会生成一个新的序列,表示原序列重复 n 次


mi = ["我是米粉", "我是忠实的米粉"]mi_new = mi * 3
print(mi_new)
复制代码


结果:


['我是米粉', '我是忠实的米粉', '我是米粉', '我是忠实的米粉', '我是米粉', '我是忠实的米粉']
复制代码


  • 还可以初始化序列的长度


mi = [None] * 3
print(mi)
复制代码


结果:


[None, None, None]
复制代码

1.5 检查某个元素是不是序列的成员(元素)

  • 使用关键字 in 检查元素是不是序列的成员


phone = ["mate9", "mate10", "mate20", "mate30", "mate40"]
print("mate40" in phone)print("mate40pro" in phone)
复制代码


结果:


TrueFalse
复制代码


  • 使用 not in 检查是否不包含的关系


phone = ["mate9", "mate10", "mate20", "mate30", "mate40"]
print("p40pro" not in phone)print("p40pro" in phone)
复制代码


结果:


TrueFalse
复制代码

1.6 计算序列的长度、最大值和最小值

  • max()返回序列中的最大元素,min()返回最小值,len()返回序列的长度


num = [10, 20, 30, 40, 50, 60]
print(max(num))print(min(num))print(len(num))
复制代码


结果:


60106
复制代码


  • 和序列相关的内置函数


num = [20, 60, 40, 30, 50, 10]num_new = sorted(num)print(sum(num))print(num)print(sorted(num))
复制代码


结果:


210[20, 60, 40, 30, 50, 10][10, 20, 30, 40, 50, 60]
复制代码



内容很多,我得坚持。。。。


2 列表

  • python 中的内置可变序列

  • 使用“ [ ] ”把元素括起来,相邻元素使用“ , ”隔开

2.1 列表的创建和删除

  • 使用赋值运算符直接创建列表


语法:name_list = [元素 1, 元素 2, 元素 3......]


name_list = ["ABC", "DEF", "GHI", "JKL"]print(name_list)
复制代码


结果:


['ABC', 'DEF', 'GHI', 'JKL']
复制代码


  • 创建空列表


语法:em_name_list = [ ]


  • 创建数值列表


语法:list(data)


new_list = list(range(1, 10))print(new_list)
复制代码


结果:


[1, 2, 3, 4, 5, 6, 7, 8, 9]
复制代码


  • 删除列表


语法:del name_list


new_list = list(range(1, 10))print(new_list)
del new_listprint(new_list)
复制代码


结果:


[1, 2, 3, 4, 5, 6, 7, 8, 9]
Traceback (most recent call last): File "F:/python_study/main.py", line 7, in <module> print(new_list)NameError: name 'new_list' is not defined
复制代码

2.2 访问列表元素

  • 结合 print()函数和角标进行配合使用


new_list = ["小学生", "初中生", "高中生", "大学生"]print(new_list)print(new_list[3])print(new_list[0])
复制代码


结果:


['小学生', '初中生', '高中生', '大学生']大学生小学生
复制代码

2.3 遍历列表

  • 使用 for 循环实现


new_list = ["小学生", "初中生", "高中生", "大学生"]for student in new_list:    print(student
复制代码


结果:


小学生初中生高中生大学生
复制代码


  • 使用 for 循环和 enumerate()函数实现,可同时输出元素内容和索引的值


new_list = ["小学生", "初中生", "高中生", "大学生"]for index, item in enumerate(new_list):    print(index, item)
复制代码


结果:


0 小学生1 初中生2 高中生3 大学生
复制代码

2.4 添加、修改和删除列表元素

  • 添加元素① name_list.append(元素) :在列表末尾追加


my_list = ["小学生", "初中生", "高中生", "大学生"]
my_list.append("研究生")print(my_list)
复制代码


结果:


['小学生', '初中生', '高中生', '大学生', '研究生']
复制代码


②name_list.extend(new_name_list):将 new_name_list 中的元素全部添加到 name_list 中


name_list = ["小学生", "初中生", "高中生", "大学生"]new_name_list = ["小学", "中学", "高中", "大学"]
print(name_list)name_list.extend(new_name_list)print(name_list)
复制代码


结果:


['小学生', '初中生', '高中生', '大学生']['小学生', '初中生', '高中生', '大学生', '小学', '中学', '高中', '大学']
复制代码


  • 修改元素: 配合角标使用


num = [1, 2, 3, 4, 5]print(num)      num[0] = 11num[4] = 55print(num)
复制代码


结果:


[1, 2, 3, 4, 5][11, 2, 3, 4, 55]
复制代码


  • 删除元素①根据索引删除,使用 del:


num = [1, 2, 3, 4, 5]print(num)
del num[0]print(num)
复制代码


结果:


[1, 2, 3, 4, 5][2, 3, 4, 5]
复制代码


②根据元素值删除,使用 remove:


num = [1, 2, 3, 4, 5]print(num)
num.remove(1)print(num)
复制代码


结果:


[1, 2, 3, 4, 5][2, 3, 4, 5]
复制代码

2.5 对列表进行统计计算

  • 获取指定元素出现的次数

  • 获取指定元素首次出现的下标

  • 统计数值列表的元素和


# -*- coding:utf-8 -*-
# 使用count()方法获取指定元素出现的次数num = [1, 2, 3, 1, 2, 3, 1, 2, 3]
print(num.count(1))
# 使用index()方法获取指定元素首次出现的下标print(num.index(3))
# 使用sum()计算数值列表元素的和print(sum(num))
复制代码


结果:


3218
复制代码

2.6 对列表进行排序

  • sort()方法①语法:name_list.sort(key=None, reverse=False)②说明:key 提取一个用于比较的键,reverse 为 True 表示降序,为 False 表示升序


num = [1, 2, 3, 1, 2, 3, 1, 2, 3]
print("原序列:", num)num.sort(reverse=False)print("升序排列:", num)num.sort(reverse=True)print("降序排列:", num)
复制代码


结果:


原序列: [1, 2, 3, 1, 2, 3, 1, 2, 3]升序排列: [1, 1, 1, 2, 2, 2, 3, 3, 3]降序排列: [3, 3, 3, 2, 2, 2, 1, 1, 1]
复制代码


  • 使用 sorted()方法①语法:sorted(list_name, key=None, reverse=False)②说明:listname 是列表名称,key 为指定的规则,reverse 为 True 表示降序,为 False 表示升序


# -*- coding:utf-8 -*-
num = [1, 2, 3, 1, 2, 3, 1, 2, 3]
print("原序列:", num)new_num = sorted(num, reverse=False)print("升序排列:", new_num)new_num_l = sorted(num, reverse=True)print("降序排列:", new_num_l)
复制代码


结果:


原序列: [1, 2, 3, 1, 2, 3, 1, 2, 3]升序排列: [1, 1, 1, 2, 2, 2, 3, 3, 3]降序排列: [3, 3, 3, 2, 2, 2, 1, 1, 1]
复制代码

2.7 列表推导式

  • 生成指定范围的数值列表

  • 生成指定需求的列表

  • 列表中选择符合条件的元素组成新的列表


# -*- coding:utf-8 -*-import random
# 生成指定范围的数值列表num = [random.randint(10, 50) for i in range(20)]print("1、随机取10到50中20个数字放到num列表中:", num)
# 生成指定需求的列表mm = 1num_list = [mm+i for i in range(10)]print("2、给变量mm每次加i,循环10次:", num_list)
# 列表中选择符合条件的元素组成新的列表zz = [20, 30, 40, 50, 60, 70, 80, 90, 100]new_zz = [j for j in zz if j > 60]print("3、原序列:", zz)print("4、取大于60后新的序列:", new_zz)
复制代码


结果:


1、随机取10到50中20个数字放到num列表中: [21, 43, 48, 40, 14, 34, 35, 28, 45, 11, 33, 33, 19, 26, 18, 23, 17, 37, 39, 27]2、给变量mm每次加i,循环10次: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]3、原序列: [20, 30, 40, 50, 60, 70, 80, 90, 100]4、取大于60后新的序列: [70, 80, 90, 100]
复制代码

3 元组

  • 元组是不可变序列

  • 使用“( )”括起来,元素间用逗号隔开

3.1 元组的创建和删除

  • 直接使用赋值运算符创建元组

  • 创建空元组

  • 创建数值元组

  • 删除元组


# -*- coding:utf-8 -*-
# 创建空元组name = ()print("这是空元组:", name)
# 直接使用赋值运算符创建元组name_new = ("laoli", "xiaozhang", "laowang")print("创建元组:", name_new)
# 创建数值元组num = tuple(range(1, 10, 2))print("创建数值元组:", num)
# 删除元组del numprint("删除num元组:", num)
复制代码


结果:


这是空元组: ()创建元组: ('laoli', 'xiaozhang', 'laowang')创建数值元组: (1, 3, 5, 7, 9)Traceback (most recent call last):  File "F:/python_study/main.py", line 17, in <module>    print("删除num元组:", num)NameError: name 'num' is not defined
复制代码

3.2 访问元组元素

  • 结合 print()和下标


# -*- coding:utf-8 -*-
num = (1, 2, 3, 4, 5, 6, 7, 8)print(num[0], num[7])print(num[-1:])
复制代码


结果:


1 8(8,)
复制代码

3.3 修改元组元素

  • 元组是不可变序列,不能修改单个元素,重新赋值生成新的元组


# -*- coding:utf-8 -*-
num = (1, 2, 3, 4, 5, 6, 7, 8)num1 = (9, 10)num2 = num + num1
print(num2)
复制代码


结果:


(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
复制代码

3.4 元组推导式

  • 同列表类似,使用推导式可以快速生成一个元组(不再赘述)

3.5 面试必备:元组与列表的区别

  • 相同点:


①都属于序列;

②都可以按照特定顺序存放一组元素;

③类型不受限制。


  • 区别:


①列表属于可变序列,元素可以修改和删除;元组属于不可变序列,元素不可以修改,但可以替换;

②列表可以使用 append()、extend()、insert()、remove()、pop()等方法,但是元组不能;

③列表可以使用切片,元组不行;

④元组比列表的访问和处理速度要快;

⑤列表不能作为字典的键值,但元组可以。

4 知识脑图


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

虫无涯

关注

专注测试领域各种技术研究、分享和交流~ 2019-12-11 加入

CSDN测试领域优质创作者 | CSDN博客专家 | 阿里云专家博主 | 华为云享专家 | 51CTO专家博主

评论

发布
暂无评论
从基础掌握Python的列表和元组_Python_虫无涯_InfoQ写作社区