什么是序列?
序列的定义:具有先后关系的一组元素,每个元素都有编号(下标/索引),可以通过下标访问。
就像你排队买奶茶,你是第0个(程序员数数从0开始),后面的人是第1、第2、第3……
Python里的字符串、元组、列表,都属于序列。它们是“兄弟类型”,共享一套通用的操作,前几天学的字符串的索引和切片也是适用的。
小知识:序列是“基类”,字符串、元组、列表是“派生类”。就像“动物”是基类,“猫、狗、老虎”是派生类。
序列通用操作符
| | |
|---|
x in s | | "a" in "abc" → True |
x not in s | | 1 not in [2,3]→ True |
s + t | | [1,2]+[3,4]→ [1,2,3,4] |
s * n | | "Hi"*3 → "HiHiHi" |
s[i] | | "Python"[0] → "P" |
s[i:j] | | [0,1,2,3][:2]→ [0,1] |
len(s) | | len("abc") → 3 |
min(s) | | min([3,1,2])→ 1 |
max(s) | | max("abc") |
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') # 倒序,原元组不变
列表类型
列表创建后可以随意修改。像黑板上的字,擦了写,写了擦。
创建方式:
ls1 = []ls2 = [1, 2, 3]ls3 = list("abc") # ['a', 'b', 'c']
常用方法(列表专属):
| | |
|---|
ls[i] = x | | ls[0]=100 |
ls[i:j:k] = lt | | ls[1:3]=[9,9] |
del ls[i] | | del ls[2] |
ls += lt | | ls+=[4,5] |
ls *= n | | ls*=2 |
ls.append(x) | | ls.append(6) |
ls.clear() | | ls.clear() |
ls.copy() | | new=ls.copy() |
ls.insert(i,x) | | ls.insert(0,99) |
ls.pop(i) | | ls.pop() |
ls.remove(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() 的区别
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]] 不受影响
综合案例:城市人口数据清洗与分析
假设我们有某省几个城市的人口数据(含脏数据),需要完成:
清洗无效数据(None、异常值)
按人口排序
去重(重复记录)
转换为元组保护,防止后续修改
输出报告
# 原始数据:城市名,人口(万人),年份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()区别、浅拷贝与深拷贝
踩坑记录:
用时: 1.5小时
📢 我是老李,35岁规划师,从零开始学AI。
每天1小时,记录真实学习路。不求成为大神,只为多一条出路。
如果你也在传统行业或者对未来感到焦虑,如果你也想学点新东西但一直没有开始
点击关注,我们一起进步;
也欢迎点赞 ❤️ 分享 ➕ 推荐,让更多同行者看到!
👇👇👇