当前位置:首页>python>Python序列

Python序列

  • 2026-10-11 08:13:34
Python序列

什么是序列?

序列的定义:具有先后关系的一组元素,每个元素都有编号(下标/索引),可以通过下标访问。

就像你排队买奶茶,你是第0个(程序员数数从0开始),后面的人是第1、第2、第3……

Python里的字符串、元组、列表,都属于序列。它们是“兄弟类型”,共享一套通用的操作,前几天学的字符串的索引和切片也是适用的。

小知识:序列是“基类”,字符串、元组、列表是“派生类”。就像“动物”是基类,“猫、狗、老虎”是派生类。

序列通用操作符

操作符/函数
说明
举例
x in s
判断x是否在序列s中
"a" in "abc" → True
x not in s
判断x是否不在序列s中
1 not in [2,3]→ True
s + t
连接两个序列
[1,2]+[3,4]→ [1,2,3,4]
s * n
 或 n * s
复制n次
"Hi"*3 → "HiHiHi"
s[i]
索引(取第i个)
"Python"[0] → "P"
s[i:j]
 或 s[i:j:k]
切片(取一段)
[0,1,2,3][:2]→ [0,1]
len(s)
长度
len("abc") → 3
min(s)
最小值
min([3,1,2])→ 1
max(s)
最大值
max("abc")
 → "c"
s.index(x[, i[, j]])
首次出现的位置
"hello".index("l")→ 2
s.count(x)
出现次数
"apple".count("p") → 2

索引和切片

字符串:  P  y  t  h  o  n正索引:  0  1  2  3  4  5负索引: -6 -5 -4 -3 -2 -1s[1:4] → "yth" (从索引1到3)s[::-1] → "nohtyP" (倒序)

这些操作对字符串、元组、列表都适用,非常统一。

元组类型

元组一旦创建,就不能修改。像刻在石头上的字,想改?重新刻一块。

创建方式:

  • 用小括号 ()

  • 或者直接用逗号隔开(不加括号也行)

# 创建元组的几种姿势t1 = ()t2 = (1, 2, 3)t3 = 1, 2, 3          # 不加括号也可以t4 = ("cat",)         # 单个元素要加逗号,否则变成字符串

特点:不可变——没有append、没有insert、不能改元素。

优点:

  • 保护数据不被意外修改

  • 可以作为字典的“键”(list不行)

  • 占用内存小,性能稍好

creature = "cat", "dog", "tiger", "human"print(creature[:: -1])  # ('human', 'tiger', 'dog', 'cat')  # 倒序,原元组不变

列表类型

列表创建后可以随意修改。像黑板上的字,擦了写,写了擦。

创建方式:

  • 方括号 []

  • list() 函数

ls1 = []ls2 = [1, 2, 3]ls3 = list("abc")   # ['a', 'b', 'c']

常用方法(列表专属):

方法
说明
例子
ls[i] = x
替换第i个元素
ls[0]=100
ls[i:j:k] = lt
用列表lt替换切片
ls[1:3]=[9,9]
del ls[i]
删除第i个元素
del ls[2]
ls += lt
扩展列表(等价extend)
ls+=[4,5]
ls *= n
重复n次
ls*=2
ls.append(x)
末尾添加
ls.append(6)
ls.clear()
清空
ls.clear()
ls.copy()
复制(浅拷贝)
new=ls.copy()
ls.insert(i,x)
在i位置插入x
ls.insert(0,99)
ls.pop(i)
取出并删除第i个(默认末尾)
ls.pop()
ls.remove(x)
删除第一个x
ls.remove(3)
ls.reverse()
反转列表(原地)
ls.reverse()

数据保护技巧:如果想把列表保护起来不让修改,可以用 tuple(ls) 转成元组。

这些你可能也会用到

1. 序列嵌套

列表和元组可以互相嵌套,就像俄罗斯套娃。

matrix = [[1,2],[3,4]]        # 二维列表city_info = [("郑州", 1280), ("北京", 2189)]  # 列表包元组print(city_info[0][1])        # 1280

2. 列表推导式(快速生成列表)

一行代码生成新列表,比循环简洁。

# 生成1-10的平方squares = [x**2 for x in range(1,11)]# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]# 带条件筛选:只取偶数平方even_squares = [x**2 for x in range(1,11) if x%2==0]# [4, 16, 36, 64, 100]

3. 元组和列表互转

t = (1,2,3)ls = list(t)      # 元组→列表t2 = tuple(ls)    # 列表→元组

4. sorted() 与 list.sort() 的区别

  • sorted(序列) 返回新列表,原序列不变(通用)

  • 列表.sort() 原地修改,不返回值(列表专属)

5. 深拷贝 vs 浅拷贝

.copy() 只复制外层,嵌套的内层还是引用。要完全独立用 copy.deepcopy()。

import copyoriginal = [[1,2],[3,4]]shallow = original.copy()deep = copy.deepcopy(original)original[0][0] = 99print(shallow)  # [[99,2],[3,4]] 受影响print(deep)     # [[1,2],[3,4]] 不受影响

综合案例:城市人口数据清洗与分析

假设我们有某省几个城市的人口数据(含脏数据),需要完成:

  1. 清洗无效数据(None、异常值)

  2. 按人口排序

  3. 去重(重复记录)

  4. 转换为元组保护,防止后续修改

  5. 输出报告

# 原始数据:城市名,人口(万人),年份raw_data = [    ["郑州", 1280, 2023],    ["洛阳", 720, 2023],    ["南阳", None, 2023],      # 人口缺失    ["郑州", 1280, 2023],      # 重复    ["信阳", 623, 2023],    ["南阳", 970, 2023],       # 修正后的南阳数据    ["周口", 880, 2023]]print("=== 原始数据 ===")for item in raw_data:    print(item)# 1. 清洗:过滤人口为None或小于600万(可能异常)cleaned = []for city in raw_data:    name, pop, year = city    if pop is not None and pop >= 600:        cleaned.append([name, pop, year])print("\n=== 清洗后(过滤无效和异常) ===")for item in cleaned:    print(item)# 2. 去重:用元组放进集合(自动去重)再转回列表unique_set = {tuple(city) for city in cleaned}unique_list = [list(t) for t in unique_set]print("\n=== 去重后 ===")for item in unique_list:    print(item)# 3. 按人口降序排序unique_list.sort(key=lambda x: x[1], reverse=True)print("\n=== 按人口降序排序 ===")for item in unique_list:    print(f"{item[0]:4s}{item[1]}万")# 4. 转换为元组保护(防止后续意外修改)protected_data = [tuple(city) for city in unique_list]print("\n=== 转换为元组(只读保护) ===")print(protected_data)# 5. 尝试修改元组会报错(演示保护)# protected_data[0][1] = 2000  # 取消注释会报错# 6. 统计指标populations = [city[1] for city in protected_data]print(f"\n=== 统计 ===")print(f"城市数量: {len(populations)}")print(f"总人口: {sum(populations)}万")print(f"平均人口: {sum(populations)/len(populations):.1f}万")print(f"人口最多: {max(populations)}万")print(f"人口最少: {min(populations)}万")# 7. 使用index查询某个城市的位置try:    idx = [city[0] for city in protected_data].index("洛阳")    print(f"\n洛阳在列表的第{idx+1}位")except ValueError:    print("\n未找到该城市")
运行结果片段:
=== 原始数据 ===['郑州', 1280, 2023]['洛阳', 720, 2023]['南阳', None, 2023]['郑州', 1280, 2023]['信阳', 623, 2023]['南阳', 970, 2023]['周口', 880, 2023]=== 清洗后(过滤无效和异常) ===['郑州', 1280, 2023]['洛阳', 720, 2023]['郑州', 1280, 2023]['信阳', 623, 2023]['南阳', 970, 2023]['周口', 880, 2023]=== 去重后 ===['信阳', 623, 2023]['郑州', 1280, 2023]['周口', 880, 2023]['洛阳', 720, 2023]['南阳', 970, 2023]=== 按人口降序排序 ===郑州   1280万南阳   970万周口   880万洛阳   720万信阳   623万=== 转换为元组(只读保护) ===[('郑州', 1280, 2023), ('南阳', 970, 2023), ('周口', 880, 2023), ('洛阳', 720, 2023), ('信阳', 623, 2023)]=== 统计 ===城市数量: 5总人口: 4473万平均人口: 894.6万人口最多: 1280万人口最少: 623万洛阳在列表的第4位

📌 今日学习笔记:

学到了什么:

  • 序列定义:有先后关系的一组元素,可通过下标访问;基类类型,派生类有字符串、元组、列表

  • 通用操作符/函数:in、not in、+、*、[]、[:]、len()、min()、max()、index()、count()

  • 元组:不可变,使用()或逗号创建,常用于保护数据、字典键

  • 列表:可变,使用[]或list()创建,有丰富方法如append、insert、pop、remove、reverse、sort等

  • 数据保护:tuple(ls) 可将列表转元组防止修改

  • 补充:序列嵌套、列表推导式、sorted()与sort()区别、浅拷贝与深拷贝

踩坑记录:

  • ls.sort() 是原地修改,不返回新列表;sorted(ls) 才返回新列表,一开始总搞混

  • 浅拷贝复制嵌套列表时,内层列表还是同一个,改了跟着变,后来用了deepcopy

用时: 1.5小时


📢 我是老李,35岁规划师,从零开始学AI。

每天1小时,记录真实学习路。不求成为大神,只为多一条出路。

如果你也在传统行业或者对未来感到焦虑,如果你也想学点新东西但一直没有开始

点击关注,我们一起进步;

也欢迎点赞 ❤️ 分享 ➕ 推荐,让更多同行者看到!

👇👇👇

最新文章

随机文章