当前位置: 首页 > news >正文

一、快速掌握python中的序列、集合和字典的用法(数据容器)

一、快速掌握python中的序列、集合和字典的用法

文章目录

  • 一、快速掌握python中的序列、集合和字典的用法
  • 1.序列
    • 列表(list)切片用法表
    • 元组(tuple)切片用法表
    • 字符串(str)切片用法表
    • ✨ 口诀
    • 一、定义
    • 二、作用
    • 三、语法格式
    • 四、所有常见用法速览
    • 五、示例代码(含注释)
      • 1) 基本、负索引、步长与倒序
      • 2) 列表切片赋值(替换 / 插入 / 等长步长赋值)
      • 3) 字符串与元组(只读序列:只能“取”,不能切片赋值)
      • 4) bytes / bytearray(bytearray 可切片赋值)
      • 5) 使用 `slice` 对象与 `indices`
      • 6) 迭代器“切片”替代:`itertools.islice`
    • 六、行为与性能要点(容易踩坑)
    • 七、实用模板(拿来即用)
  • 2.集合
    • 一、定义
    • 二、作用
    • 三、语法格式
    • 四、集合常见语法汇总表
    • 五、基础示例(带详细注释)
  • 3.字典
    • 一、定义
    • 二、作用
    • 三、语法格式
    • 四、字典常见语法汇总表
    • 五、基础示例(详细注释)
  • python数据容器对比表

1.序列

列表(list)切片用法表

写法含义示例
a[i:j]取从下标 i 到 j-1 的元素a=[0,1,2,3,4]; a[1:4] → [1,2,3]
a[:j]从开头到 j-1a[:3] → [0,1,2]
a[i:]从 i 到最后a[2:] → [2,3,4]
a[:]整个列表复制一份a[:] → [0,1,2,3,4]
a[::k]步长 k,隔 k 个取一个a[::2] → [0,2,4]
a[::-1]倒序a[::-1] → [4,3,2,1,0]
a[i:j:k]从 i 到 j-1,步长 ka[1:5:2] → [1,3]
a[-m:]取最后 m 个a[-3:] → [2,3,4]
a[:-m]除去最后 m 个a[:-2] → [0,1,2]
a[::]等价于 a[:]a[::] → [0,1,2,3,4]
a[i:i] = [...]插入元素a=[1,2,3]; a[1:1]=[9] → [1,9,2,3]
a[i:j] = [...]替换 i 到 j-1 的元素a=[0,1,2,3]; a[1:3]=[10,20] → [0,10,20,3]
a[::k] = [...]按步长替换,数量必须匹配a=[0,1,2,3,4]; a[::2]=[9,9,9] → [9,1,9,3,9]
del a[i:j]删除 i 到 j-1a=[0,1,2,3,4]; del a[1:3] → [0,3,4]
a[i:j]=[]删除 i 到 j-1a=[0,1,2,3]; a[1:3]=[] → [0,3]
a[:] = []清空整个列表a=[1,2,3]; a[:]=[] → []

元组(tuple)切片用法表

写法含义示例
t[i:j]取从下标 i 到 j-1 的元素t=(10,20,30,40); t[1:3] → (20,30)
t[:j]从开头到 j-1t[:2] → (10,20)
t[i:]从 i 到最后t[2:] → (30,40)
t[:]整个元组复制一份t[:] → (10,20,30,40)
t[::k]步长 k,隔 k 个取一个t[::2] → (10,30)
t[::-1]倒序t[::-1] → (40,30,20,10)
t[i:j:k]从 i 到 j-1,步长 kt[0:4:2] → (10,30)
t[-m:]取最后 m 个t[-2:] → (30,40)
t[:-m]除去最后 m 个t[:-2] → (10,20)
t[::]等价于 t[:]t[::] → (10,20,30,40)

⚠️ 元组是不可变的 → 不能切片赋值、不能删除


字符串(str)切片用法表

写法含义示例
s[i:j]取从下标 i 到 j-1 的子串s="Hello"; s[1:4] → 'ell'
s[:j]从开头到 j-1s[:2] → 'He'
s[i:]从 i 到最后s[2:] → 'llo'
s[:]整个字符串复制一份s[:] → 'Hello'
s[::k]步长 k,隔 k 个取一个s[::2] → 'Hlo'
s[::-1]倒序s[::-1] → 'olleH'
s[i:j:k]从 i 到 j-1,步长 ks[0:5:2] → 'Hlo'
s[-m:]取最后 m 个s[-3:] → 'llo'
s[:-m]除去最后 m 个s[:-2] → 'Hel'
s[::]等价于 s[:]s[::] → 'Hello'

⚠️ 字符串也是不可变的 → 不能切片赋值、不能删除


✨ 口诀

  • 左闭右开:取到起点,不取到终点。
  • 省略:开头省略就是 0,结尾省略就是最后。
  • 负数-1 表示最后一个,-2 倒数第二个。
  • 步长:正数往右,负数往左,不能是 0。
  • 字符串/元组:只能切不能改。
  • 列表:能切还能改,还能删还能插。

一、定义

切片(slice)是针对“序列类型”的索引区间操作。它按给定的起始下标、结束下标、步长,从原序列中取出一个子序列并返回同类型(或等价类型)的新对象。
支持切片的常见类型:listtuplestrbytesbytearrayrange 等(注意:迭代器/生成器本身不支持切片)。

二、作用

  • 快速截取子序列跳步抽样倒序
  • 可变序列(如 listbytearray)还能做:原位替换、插入、删除(称“切片赋值/删除”)。
  • 安全地做浅拷贝a[:])。

三、语法格式

seq[start : stop : step]
# start 起始下标(含),可省略;默认序列开头
# stop  结束下标(不含),可省略;默认序列末尾
# step  步长,正负都可,不能为 0;省略等于 1

索引规则与边界:

  • 左闭右开:包含 start,不包含 stop
  • 可为负数-1 表示最后一个元素。
  • 越界不报错:自动截断到有效范围(IndexError 只发生在单个下标访问时)。
  • 反向切片step < 0 表示从右向左取;此时若省略 start/stop,分别默认为末尾/开头前一位,如 seq[::-1]

四、所有常见用法速览

  • 基本区间:s[i:j]
  • 省略端点:s[:j]s[i:]s[:](浅拷贝)
  • 跳步抽样:s[::k](每 k 个取一个)
  • 负步长倒序:s[::-1](整体反转)、s[j:i:-1]
  • 负索引:s[-3:]s[:-3]s[-5:-2]
  • 列表切片赋值:a[i:j] = iterable(替换/插入)、a[i:j:k] = iterable(步长赋值,长度须匹配
  • 列表切片删除:del a[i:j]del a[::k]a[:] = [] 清空
  • slice 对象:idx = slice(i, j, k); s[idx]idx.indices(len(s)) 可规范化三元组
  • 迭代器等的“切片”替代:itertools.islice(iterable, start, stop, step)

五、示例代码(含注释)

1) 基本、负索引、步长与倒序

s = ['a','b','c','d','e','f','g','h']print(s[2:5])      # ['c', 'd', 'e']   从索引2到4
print(s[:3])       # ['a','b','c']     省略 start,默认开头
print(s[5:])       # ['f','g','h']     省略 stop,默认末尾
print(s[:])        # 浅拷贝(新列表)print(s[-3:])      # ['f','g','h']     末尾3个
print(s[:-3])      # ['a','b','c','d','e']  去掉最后3个
print(s[::2])      # ['a','c','e','g'] 每隔1个取1个
print(s[::-1])     # ['h','g','f','e','d','c','b','a']  倒序
print(s[5:1:-1])   # ['f','e','d','c'] 从索引5降到2(不含1)

细节:step 不能为 0,否则 ValueErrorstart/stop 越界会被“钳制”,返回尽可能合理的子序列(不会抛错)。

2) 列表切片赋值(替换 / 插入 / 等长步长赋值)

a = [0, 1, 2, 3, 4, 5]a[2:4] = [20, 30, 40]     # 替换+扩容:在 [2,4) 放入 3 个元素
# a 现在是 [0, 1, 20, 30, 40, 4, 5]a[1:1] = ['X','Y']        # 在索引1处插入两个
# a 现在是 [0, 'X', 'Y', 1, 20, 30, 40, 4, 5]a[::2] = [9,9,9,9,9]      # 步长赋值:目标位置是索引 0,2,4,6,8
# 长度必须严格相等,否则 ValueErrordel a[3:7]                 # 删除区间
# 也可:a[3:7] = []       # 等价效果a[:] = []                  # 清空列表(等价于 a.clear())

3) 字符串与元组(只读序列:只能“取”,不能切片赋值)

t = (10, 20, 30, 40, 50)
print(t[1:4])       # (20, 30, 40)  返回新元组st = "Hello, world!"
print(st[7:12])     # 'world'
print(st[::-1])     # '!dlrow ,olleH'
# st[0:1] = 'h'     # ❌ 不允许:字符串不可变

4) bytes / bytearray(bytearray 可切片赋值)

ba = bytearray(b'abcdef')
ba[1:4] = b'XYZ'       # 可变字节序列可直接替换
print(ba)              # bytearray(b'aXYZef')b = b'abcdef'
print(b[1:4])          # b'bcd'(bytes 只读,不能赋值)

5) 使用 slice 对象与 indices

s  = ['A','B','C','D','E','F','G']
idx = slice(1, 6, 2)         # 等价于 [1:6:2]
print(s[idx])                # ['B','D','F']
print(idx.indices(len(s)))   # (1, 7, 2)  -> 规范化为合法范围(stop 可能被扩展到 len)

6) 迭代器“切片”替代:itertools.islice

from itertools import islicedef gen():for i in range(10):yield i*ig = gen()
# g[2:8:2]  # ❌ 生成器不支持切片
part = list(islice(g, 2, 8, 2))  # ✅ 取索引 2,4,6 的元素
print(part)  # [4, 16, 36]

六、行为与性能要点(容易踩坑)

  • 拷贝语义a[:]浅拷贝,只复制最外层容器;嵌套对象仍然共享引用。深拷贝用 copy.deepcopy(a)
  • 时间复杂度:创建切片大致 O(k)(k 为切片长度);大切片会占用额外内存。
  • 等长要求a[i:j:k] = iterable 时,右侧可迭代对象的元素个数必须与目标位置个数一致
  • 负步长默认端点seq[::-1] 等价于 seq[len(seq)-1 : None : -1],记住“左闭右开”仍然成立。
  • 越界安全s[100:200] 返回空序列,不抛错;但 s[100]IndexError

七、实用模板(拿来即用)

# 1) 常见片段
left3      = s[:3]
right3     = s[-3:]
middle     = s[i:j]
skip_2     = s[::2]
reversed_s = s[::-1]# 2) 安全浅拷贝(不可变/可变通用)
copy_s     = s[:]# 3) 列表原位操作
a[i:j]     = new_block       # 替换/插入
del a[i:j]                   # 删除
a[:]       = []              # 清空# 4) 复杂切片复用
take_even  = slice(0, None, 2)   # 偶数位
print(s[take_even])

2.集合

一、定义

集合(set) 是一种 无序、可变、元素不重复 的数据类型,用于存储多个唯一值。
集合里的元素必须是 可哈希的(比如数字、字符串、元组),但 不能是 list/dict/set 这种可变类型。


二、作用

  1. 去重:自动去掉重复元素。
  2. 成员测试:快速判断某个元素是否在集合里。
  3. 集合运算:并集、交集、差集、对称差等。
  4. 数据清洗:比如快速去掉列表里重复的数据。

三、语法格式

# 创建集合
s = {元素1, 元素2, ...}       # 用大括号
s = set([可迭代对象])          # 用 set() 函数# 常见操作
s.add(x)                      # 添加一个元素
s.remove(x)                   # 删除元素(不存在会报错)
s.discard(x)                  # 删除元素(不存在也不报错)
s.pop()                       # 随机删除并返回一个元素
s.clear()                     # 清空集合

四、集合常见语法汇总表

操作语法说明
创建集合{1,2,3}set([1,2,3])定义集合,自动去重
添加s.add(x)加一个元素
删除s.remove(x)删一个元素,不存在时报错
删除(安全)s.discard(x)删一个元素,不存在不报错
随机删除s.pop()随机取出并删除一个元素
清空s.clear()清空集合
成员测试x in sx not in s判断元素是否在集合里
并集`sts.union(t)`
交集s & ts.intersection(t)取两个集合共同的部分
差集s - ts.difference(t)在 s 里但不在 t 里
对称差集s ^ ts.symmetric_difference(t)在 s 或 t 中,但不同时在两个里
子集判断s <= ts.issubset(t)判断 s 是否是 t 的子集
真子集s < ts 是 t 的子集但不等于 t
超集判断s >= ts.issuperset(t)判断 s 是否包含 t
真超集s > ts 包含 t 但不等于 t
长度len(s)集合中元素个数
转换list(s)tuple(s)把集合转成列表或元组
  • 补充

difference_update()

  • 作用:把集合 1 中与集合 2 重叠的元素删掉,直接修改集合 1,不返回新集合。
  • 示例
a = {1,2,3,4}
b = {3,4,5}
a.difference_update(b)
print(a)  # {1,2}   (3 和 4 被删掉了)

对比:a.difference(b) 返回新集合,a 不变。

五、基础示例(带详细注释)

# 1. 创建集合
s1 = {1, 2, 3, 3, 2}      # 自动去重
print(s1)  # {1, 2, 3}s2 = set([2, 3, 4])       # 用 set() 从列表创建集合
print(s2)  # {2, 3, 4}# 2. 添加元素
s1.add(5)
print(s1)  # {1, 2, 3, 5}# 3. 删除元素
s1.remove(2)              # 删除 2
print(s1)  # {1, 3, 5}s1.discard(10)            # 删除一个不存在的元素,不报错
print(s1)  # {1, 3, 5}# 4. 成员测试
print(3 in s1)   # True
print(4 not in s1) # True# 5. 并集、交集、差集、对称差集
print(s1 | s2)  # 并集 {1, 3, 4, 5, 2}
print(s1 & s2)  # 交集 {3}
print(s1 - s2)  # 差集 {1, 5}
print(s1 ^ s2)  # 对称差集 {1, 2, 4, 5}# 6. 子集、超集
a = {1,2}
b = {1,2,3}
print(a <= b)   # True,a 是 b 的子集
print(b >= a)   # True,b 是 a 的超集
print(a < b)    # True,真子集
print(b > a)    # True,真超集# 7. 清空
s1.clear()
print(s1)  # set(),空集合

3.字典

一、定义

字典(dict)键值对(key-value) 的无序可变集合。

  • 键(key):必须是不可变、可哈希的类型(数字、字符串、元组)。
  • 值(value):可以是任意对象(数字、字符串、列表、字典等)。
  • 一个键只能对应一个值,键不能重复。

二、作用

  1. 快速查找:基于键访问,效率高。
  2. 存储映射关系:如学号 → 姓名,商品名 → 价格。
  3. 数据组织:比列表更灵活,适合存储结构化数据。

三、语法格式

# 定义字典
d = {"key1": value1, "key2": value2}
d = dict(key1=value1, key2=value2)   # 用 dict() 函数# 访问
d["key"]          # 取值
d.get("key", 默认) # 取值,不存在返回默认# 增改
d["key"] = value# 删除
del d["key"]
d.pop("key", 默认)   # 删除并返回值
d.popitem()         # 删除并返回最后一对键值
d.clear()           # 清空字典

四、字典常见语法汇总表

操作语法说明
创建字典{"a":1,"b":2}dict(a=1,b=2)定义字典
访问值d["a"]键存在返回值,不存在报错
安全访问d.get("a", 默认)键不存在返回默认值
新增或修改d["c"]=3没有就新增,有就修改
删除指定键del d["a"]删除键对应的项
删除并返回值d.pop("a", 默认)不存在时返回默认
删除最后一项d.popitem()删除并返回最后一个键值对
清空d.clear()清空整个字典
键列表d.keys()返回所有键(可迭代视图)
值列表d.values()返回所有值(可迭代视图)
键值对列表d.items()返回所有 (key,value)
遍历for k,v in d.items():遍历键值对
更新d.update({"x":100})合并或更新字典
判断键存在"a" in d返回 True/False
长度len(d)返回字典中键值对数量
拷贝d.copy()浅拷贝
fromkeysdict.fromkeys(["a","b"],0)生成新字典,初始值为0

五、基础示例(详细注释)

# 1. 创建字典
d = {"name":"Alice", "age":20}
print(d)  # {'name': 'Alice', 'age': 20}# 2. 访问
print(d["name"])        # Alice
# print(d["gender"])    # ❌ KeyError
print(d.get("gender", "未知"))  # "未知"# 3. 新增与修改
d["gender"] = "female"  # 新增
d["age"] = 21           # 修改
print(d)  # {'name':'Alice','age':21,'gender':'female'}# 4. 删除
del d["gender"]
print(d)  # {'name':'Alice','age':21}val = d.pop("age")      # 删除并返回值
print(val)  # 21
print(d)    # {'name':'Alice'}# 5. 遍历
d = {"a":1,"b":2,"c":3}
print(list(d.keys()))    # ['a','b','c']
print(list(d.values()))  # [1,2,3]
print(list(d.items()))   # [('a',1),('b',2),('c',3)]for k,v in d.items():print(k, "→", v)
# 输出:
# a → 1
# b → 2
# c → 3# 6. 更新
d.update({"b":200,"d":4})
print(d)  # {'a':1,'b':200,'c':3,'d':4}# 7. 清空
d.clear()
print(d)  # {}

python数据容器对比表

特性列表 list元组 tuple字符串 str集合 set字典 dict
元素数量支持多个支持多个支持多个支持多个支持多个
元素类型任意任意仅字符(本质仍是 str 对象)任意可哈希对象Key:不可变类型;Value:任意类型
下标索引支持支持支持不支持不支持(通过键访问)
重复元素支持支持支持不支持Key 不支持重复,Value 支持
可修改性支持不支持不支持支持支持
数据有序✅ 有序✅ 有序✅ 有序❌ 无序❌ 无序(3.7+ 插入顺序保留,但逻辑上无序)
复元素支持支持支持不支持Key 不支持重复,Value 支持
可修改性支持不支持不支持支持支持
数据有序✅ 有序✅ 有序✅ 有序❌ 无序❌ 无序(3.7+ 插入顺序保留,但逻辑上无序)
使用场景可修改、可重复的一批数据记录不可修改、可重复的一批数据记录一串字符的记录与处理不可重复的数据集合、集合运算Key-Value 形式的数据映射与查找
http://www.dtcms.com/a/338546.html

相关文章:

  • RxJava 在 Android 即时通讯中的应用:封装、处理与控制
  • 《WASM驱动本地PDF与Excel预览组件的深度实践》
  • 达梦数据库表恢复方法总结
  • 章11:管理网络
  • 网络基础——网络传输基本流程
  • Android Coil 3拦截器Interceptor计算单次请求耗时,Kotlin
  • GPT-4.1旗舰模型:复杂任务的最佳选择及API集成实践
  • 基于prompt的生物信息学:多组学分析的新界面
  • RecSys:粗排模型和精排特征体系
  • 力扣57:插入区间
  • Apache IoTDB:大数据时代时序数据库选型的技术突围与实践指南
  • 【力扣 Hot100】 刷题日记——双指针的经典应用
  • 论文阅读:Prompt Optimization in Large Language Models
  • @Linux问题 :bash fork Cannot allocate memory 错误分析与解决方案
  • Spring Boot 使用 单元测试(JUnit )教程
  • 【LeetCode题解】LeetCode 162. 寻找峰值
  • 什么是矩阵系统源码搭建定制化开发,支持OEM贴牌
  • AndroidR车机系统Settings数据库增加非持久化存储键值方案-续
  • 快手可灵招海外产品运营实习生
  • vue,H5车牌弹框定制键盘包括新能源车牌
  • word如何转换为pdf
  • 网络基础——Socket编程预备
  • 专题:2025母婴行业消费洞察与分龄营养趋势报告|附40 +份报告PDF、交互图表数据汇总下载
  • MongoDB知识速查
  • uni-app页面使用u-view组件简化版列表页+详情页实现
  • 【最新版】CRMEB Pro版v3.4系统源码全开源+PC端+uniapp前端+搭建教程
  • Selenium自动化测试入门:cookie处理
  • C语言实战:从零开始编写一个通用配置文件解析器
  • Docker+Nginx+Node.js实战教程:从零搭建高可用的前后端分离项目
  • 阿里云参数配置化