资讯动态

Python 编程操作连载之字符串,列表,字典和集合处理

发布时间:2026/10/8 16:02:24 来源:尧图企业网站定制
前言Python 内置的四种主力数据结构——字符串str、列表list、字典dict、集合set——覆盖了日常开发里绝大多数数据组织的需求。它们的接口看起来相似都能len()、都能for遍历、都有in成员测试但可变性、有序性、去重语义这三条底层属性差别很大混用时会出奇怪的错。最常见的误解有三个以为字符串可以像列表那样按下标赋值以为集合set也保序以为list.sort()会返回排好序的新列表。这三个都是错的后面的章节会逐个说明。本文用 Python 3 的写法串讲这四种结构的创建、增删改查与相互转换并标注了版本相关行为比如字典保序是从 3.7 开始的。一、字符串 str不可变的字符序列str是不可变immutable类型任何「修改」都是返回新对象# 适用于 Python 3.8s hellos2 s.upper()print(s, s2) # hello HELLO常用操作# 适用于 Python 3.8s Python-3.14print(s[0]) # P 下标取值print(s[-1]) # 4 负下标从尾部数print(s[0:6]) # Python 切片左闭右开print(s[::-1]) # 41.3-nohtyP 反转print(s.split(-)) # [Python, 3.14]print(.join([a, b])) # abprint(s.startswith(Py)) # Trueprint(py in s.lower()) # True关键点str没有append、remove、sort这类原地方法join是分隔符调用的.join(iterable)里的元素必须全是str。二、列表 list可变、有序、允许重复# 适用于 Python 3.8nums [3, 1, 2]nums.append(4) # 尾部追加nums.insert(0, 9) # 指定位置插入nums.remove(1) # 删除第一个等于 1 的元素popped nums.pop() # 弹出并返回最后一个print(nums, popped) # [9, 3, 2] 4排序有两个入口行为完全不同# 适用于 Python 3.8nums [3, 1, 2]new sorted(nums) # 返回新列表原列表不变print(new, nums) # [1, 2, 3] [3, 1, 2]result nums.sort() # 原地排序返回值是 Noneprint(result, nums) # None [1, 2, 3]sorted(iterable, /, *, keyNone, reverseFalse)接受任何可迭代对象并返回新列表list.sort(*, keyNone, reverseFalse)只作用于列表本身且返回None。把nums nums.sort()写出来nums就变成None了。三、字典 dict键值映射3.7 起保序# 适用于 Python 3.8user {name: Alice, age: 30}user[city] Beijing # 新增print(user.get(job)) # None取不存在的键不报错print(user.get(job, N/A)) # N/A给默认值print(list(user.items())) # [(name,Alice), (age,30), (city,Beijing)]del user[age] # 删除要点键必须可哈希hashable。str、int、tuple元素也都可哈希时能做键list、dict、set不能。d[k]在键不存在时抛KeyErrord.get(k)返回Noned.get(k, default)返回默认值。从 Python 3.7 起字典的迭代顺序保证是插入顺序3.6 是实现细节不要依赖。.keys()、.values()、.items()返回视图不是列表。两个字典合并Python 3.9 起有专门运算符# 适用于 Python 3.9a {x: 1}b {y: 2}print(a | b) # {x: 1, y: 2}a | b # 原地更新3.9 之前只能写a.update(b)或{**a, **b}。四、集合 set无序、去重、做成员测试# 适用于 Python 3.8tags {python, web, python}print(tags) # {python, web} —— 自动去重但顺序不保证print(web in tags) # True集合不支持下标访问tags[0]会TypeError。它的价值在于平均常数时间的成员测试以及下面这些集合运算# 适用于 Python 3.8a {1, 2, 3}b {3, 4}print(a | b) # {1, 2, 3, 4} 并集print(a b) # {3} 交集print(a - b) # {1, 2} 差集print(a ^ b) # {1, 2, 4} 对称差set是可变类型里面只能放可哈希对象需要不可变的集合版本时用frozenset它可以放进另一个set或当作dict的键。四种结构的横向对比结构可变有序允许重复下标访问典型用途str否是是是文本list是是是是有序序列dict是3.7 保插入序键不可重复按键键值映射set是否否否去重、成员测试tuple否是是是不可变序列五、相互转换与推导式四种结构之间可以自由转换# 适用于 Python 3.8text bananaprint(list(text)) # [b,a,n,a,n,a]print(set(text)) # 去重后只剩 3 个字符顺序不保证print(sorted(set(text))) # [a,b,n]去重后排序print(.join(sorted(set(text)))) # abnprint(dict.fromkeys(text, 0)) # {b:0,a:0,n:0}推导式comprehension是构建这几种结构最简洁的方式# 适用于 Python 3.8words [aa, b, ccc]print([w.upper() for w in words]) # 列表推导式print({w: len(w) for w in words}) # 字典推导式print({len(w) for w in words}) # 集合推导式自动去重print(sum(len(w) for w in words)) # 生成器表达式不建列表最后一行是生成器表达式generator expression它不一次性建出整个列表做求和、求最大值这类聚合时更省内存。常见坑点以为字符串能原地改❌s abc; s[0] A→TypeError: str object does not support item assignment✅s A s[1:]或整体重建s .join(...)把sort()的返回值赋回去❌nums nums.sort()nums变成None✅ 原地排序用nums.sort()不接收返回值需要新列表用nums sorted(nums)以为集合保序❌ 依赖for x in {b, a}输出b再a✅ 顺序不保证需要顺序就sorted(s)或改用列表/字典用不可哈希对象做字典键或集合元素❌{[a]: 1}或{[1, 2], [3]}→TypeError: unhashable type: list✅ 换成tuple{(a,): 1}、{(1, 2), (3,)}dict[k]与dict.get(k)混用❌ 用d[missing]取值键不存在时抛KeyError✅ 不确定键是否存在时用d.get(missing)需要默认值时d.get(k, 0)set的下标访问❌s {1, 2, 3}; s[0]→TypeError: set object is not subscriptable✅ 用列表推导或list(s)[0]但注意顺序不保证把套在字符串循环拼接上❌for w in words: out w反复拼接官方文档明确指出会产生二次复杂度 ✅out .join(words)在遍历dict或set时增删❌for k in d: d[k !] 1→RuntimeError: dictionary changed size during iteration✅ 先for k in list(d):再改总结操作strlistdictset取长度len(s)len(l)len(d)len(s)成员测试x in sx in lk in dx in s添加不可变重建append/insertd[k]vadd删除不可变重建remove/popdel d[k]/popdiscard/remove排序sorted(s)l.sort()/sorted(l)按键sorted(d)sorted(s)返回新对象总是sorted是否否四种结构的选型可以归结为一句话要保序带下标就用list要按键查找就用dict只关心「有没有」和去重就用set数据本身是文本就用str。把可变性记牢——str和tuple不可变list、dict、set可变——能躲掉大半的赋值与传参误区。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑