一、数据结构全景图

1.1 一句话认识五大结构

# 如果把数据比作"物品",数据结构就是不同的"收纳方式"

str   = "hello"        # 字符的排列(像一串珠子)
list  = [1, 2, 3]      # 有序的箱子(可以随意增删改)
tuple = (1, 2, 3)      # 封存的盒子(创建后不能改变)
dict  = {"name": "张三"} # 带标签的抽屉(通过标签找东西)
set   = {1, 2, 3}      # 独一无二的收藏柜(自动去重)

1.2 核心特性速查表

特性strlisttupledictset
是否有序 有序 有序 有序 有序(3.7+) 无序
是否可变 不可变 可变 不可变 可变 可变
是否允许重复- 允许 允许 键唯一 元素唯一
访问方式整数索引整数索引整数索引键(key)无索引
元素类型限制字符任意任意键不可变元素不可变
创建符号" "[ ]( ){ }{ }
典型场景文本处理动态序列不可变序列键值映射去重/集合运算

二、字符串(str)—— 文本的容器

2.1 本质与特性

字符串是不可变的字符序列,每个字符就像项链上的一颗珠子,一旦串好就不能改变。

# 创建方式
s1 = 'hello'              # 单引号
s2 = "world"              # 双引号
s3 = """多行
字符串"""                  # 三引号
s4 = str(123)             # 类型转换 → "123"

# 核心特性:不可变
s = "hello"
# s[0] = "H"  #  TypeError: 'str' object does not support item assignment
s = "H" + s[1:]  #  创建新字符串 "Hello"

2.2 常用方法速查

s = "  Hello World  "

# 大小写转换
s.upper()          # "  HELLO WORLD  "
s.lower()          # "  hello world  "
s.capitalize()     # "  hello world  "
s.title()          # "  Hello World  "

# 去除空白
s.strip()          # "Hello World"
s.lstrip()         # "Hello World  "
s.rstrip()         # "  Hello World"

# 查找与判断
s.find("World")    # 8(返回索引,不存在返回 -1)
s.index("World")   # 8(不存在抛出 ValueError)
s.startswith("  ") # True
s.endswith("ld  ") # True
"123".isdigit()    # True
"abc".isalpha()    # True

# 分割与拼接
s.split()          # ['Hello', 'World']
"a,b,c".split(",") # ['a', 'b', 'c']
"-".join(["a","b"]) # "a-b"

# 替换
s.replace("World", "Python")  # "  Hello Python  "

2.3 常用场景

# 1. 用户输入清洗
username = input("请输入用户名:").strip().lower()

# 2. 格式化输出
name = "张三"
age = 25
print(f"姓名:{name},年龄:{age}")

# 3. 字符串拼接(大量拼接用 join)
result = "-".join(["2026", "07", "21"])  # "2026-07-21"

# 4. 字符串切片
text = "Python"
text[::-1]   # "nohtyP"(反转)
text[1:4]    # "yth"

2.4 记忆要点

字符串是不可变的字符序列,所有"修改"操作实际上都是创建新字符串。

三、列表(list)—— 动态的容器

3.1 本质与特性

列表是可变的有序序列,像一个可以随时增减物品的购物车。

# 创建方式
lst1 = []                    # 空列表
lst2 = [1, 2, 3]             # 直接创建
lst3 = list("hello")         # ['h','e','l','l','o']
lst4 = [x*2 for x in range(5)]  # [0,2,4,6,8] 列表推导式

# 核心特性:可变
lst = [1, 2, 3]
lst[0] = 100      #  修改
lst.append(4)     #  添加
lst.pop()         #  删除

3.2 常用方法速查

方法说明示例
append(x)末尾添加一个元素lst.append(4)
extend(iterable)末尾添加多个元素lst.extend([4,5])
insert(i, x)指定位置插入lst.insert(0, 0)
remove(x)删除第一个匹配项lst.remove(2)
pop(i)删除并返回指定位置元素lst.pop(0)
clear()清空列表lst.clear()
index(x)返回第一个匹配项索引lst.index(3)
count(x)统计元素出现次数lst.count(2)
sort()原地排序lst.sort()
reverse()原地反转lst.reverse()
copy()浅拷贝lst2 = lst.copy()

3.3 常用场景

# 1. 数据收集与遍历
students = []
while True:
    name = input("输入姓名(输入q退出):")
    if name == "q":
        break
    students.append(name)

# 2. 栈(后进先出)
stack = []
stack.append(1)  # 入栈
stack.append(2)
stack.pop()      # 出栈 → 2

# 3. 队列(先进先出,用 collections.deque 更好)
from collections import deque
queue = deque([1, 2, 3])
queue.append(4)   # 入队
queue.popleft()   # 出队 → 1

# 4. 列表推导式(快速生成)
squares = [x**2 for x in range(10) if x % 2 == 0]  # [0,4,16,36,64]

四、元组(tuple)—— 固定的容器

4.1 本质与特性

元组是不可变的有序序列,像一个被封存的时光胶囊,一旦创建就无法改变。

# 创建方式
t1 = ()                    # 空元组
t2 = (1,)                  # 单元素元组(注意逗号!)
t3 = (1, 2, 3)             # 直接创建
t4 = tuple([1, 2, 3])      # 从列表转换

# 核心特性:不可变
t = (1, 2, 3)
# t[0] = 100  #  TypeError: 'tuple' object does not support item assignment

# 但可以整体重新赋值
t = (4, 5, 6)  # 

4.2 常用方法

元组的方法很少,因为不可变:

方法说明示例
count(x)统计元素出现次数t.count(2)
index(x)返回第一个匹配项索引t.index(3)
len(t)获取长度len(t)

4.3 常用场景

# 1. 函数返回多个值
def get_user():
    return "张三", 25, "男"  # 返回元组

name, age, sex = get_user()  # 解包赋值

# 2. 字典的键(元组是不可变的)
locations = {
    (39.9, 116.4): "北京",
    (31.2, 121.5): "上海"
}

# 3. 记录不可变的数据
DAYS_OF_WEEK = ("一", "二", "三", "四", "五", "六", "日")
MONTHS = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

# 4. 赋值
x, y, z = (1, 2, 3)
a, b = b, a  # 交换变量

五、字典(dict)—— 映射的容器

5.1 本质与特性

字典是键值对(Key-Value)的映射容器,像一本真正的字典——通过"字"(键)快速找到"释义"(值)。

# 创建方式
d1 = {}                    # 空字典
d2 = {"name": "张三", "age": 20}  # 直接创建
d3 = dict(name="张三", age=20)    # 关键字参数
d4 = dict([("name","张三"), ("age",20)])  # 从键值对列表

# 核心特性:通过键访问
d = {"name": "张三", "age": 20}
print(d["name"])   # 张三
d["city"] = "北京"  # 新增

5.2 常用方法速查

方法说明示例
d[key]访问键(不存在报错)d["name"]
d.get(key, default)安全访问d.get("score", 0)
d.keys()获取所有键d.keys()
d.values()获取所有值d.values()
d.items()获取所有键值对d.items()
d.update(d2)合并字典d.update({"age":21})
d.pop(key)删除并返回值d.pop("age")
d.popitem()删除并返回最后一项d.popitem()
d.clear()清空字典d.clear()

5.3 常用场景

# 1. 计数器(统计频次)
text = "hello world"
count = {}
for char in text:
    count[char] = count.get(char, 0) + 1
print(count)  # {'h':1, 'e':1, 'l':3, 'o':2, ' ':1, 'w':1, 'r':1, 'd':1}

# 2. 配置管理
config = {
    "host": "localhost",
    "port": 8080,
    "debug": True
}
port = config.get("port", 3000)  # 8080
timeout = config.get("timeout", 30)  # 30(默认值)

# 3. 数据映射
user = {"id": 101, "name": "张三", "age": 20}

# 4. 嵌套字典
students = {
    "s001": {"name": "张三", "age": 20},
    "s002": {"name": "李四", "age": 21}
}
print(students["s001"]["name"])  # 张三

# 5. 字典推导式
squares = {x: x**2 for x in range(5)}  # {0:0, 1:1, 2:4, 3:9, 4:16}

5.4 注意事项 

# 1. 键必须是不可变类型
d = {
    "name": "张三",   #  字符串
    101: "学号",       #  数字
    (1,2): "坐标",     #  元组
    # [1,2]: "列表"    #  列表不能作为键
    # {"a":1}: "字典"  #  字典不能作为键
}

# 2. get() 无法区分"键不存在"和"值为 None"
d = {"score": None}
print(d.get("score"))   # None(键存在)
print(d.get("score2"))  # None(键不存在)
# 用 in 判断
if "score" in d:
    print(d["score"])

六、集合(set)—— 唯一的容器

6.1 本质与特性

集合是无序、唯一的元素容器,像一个自动去重的收藏柜——每个物品只能存放一次。

# 创建方式
s1 = set()                 # 空集合(注意:{} 是空字典!)
s2 = {1, 2, 3}             # 直接创建
s3 = set([1, 2, 2, 3])     # 从列表创建 → {1, 2, 3}(自动去重)
s4 = {x for x in range(5)} # 集合推导式 → {0,1,2,3,4}

# 核心特性:元素唯一 + 无序
s = {1, 2, 3}
s.add(2)       # 重复,被忽略
s.add(4)       # 添加成功
print(s)       # {1, 2, 3, 4}(顺序可能不同)

6.2 常用方法速查

方法说明示例
add(x)添加元素(重复忽略)s.add(5)
update(iterable)批量添加s.update([5,6])
remove(x)删除元素(不存在报错)s.remove(3)
discard(x)删除元素(不存在忽略)s.discard(10)
pop()删除并返回任意元素s.pop()
clear()清空集合s.clear()
union(s2) / |并集s1 | s2
intersection(s2) / &交集s1 & s2
difference(s2) / -差集s1 - s2
symmetric_difference(s2) / ^对称差集s1 ^ s2

6.3 常用场景

# 1. 去重
nums = [1, 2, 2, 3, 3, 3, 4]
unique = list(set(nums))  # [1, 2, 3, 4]

# 2. 成员关系判断
vip_users = {"张三", "李四", "王五"}
if "张三" in vip_users:
    print("VIP用户")

# 3. 数据比对
old_data = {"a", "b", "c"}
new_data = {"b", "c", "d"}

# 新增的元素
added = new_data - old_data    # {"d"}
# 删除的元素
removed = old_data - new_data  # {"a"}
# 保留的元素
kept = old_data & new_data     # {"b", "c"}

# 4. 提取文本中的不同字符
text = "hello world"
chars = set(text)  # {'h','e','l','o',' ','w','r','d'}

# 5. 统计不同单词
words = set("python is great python is powerful".split())
# {'python', 'is', 'great', 'powerful'}

更多推荐