欢迎光临
我们一直在努力

Python数据结构知识(三)dict 字典,tuple元组 ,set 集合

dict 字典

一、底层与基础特性

  • 底层实现:字典基于哈希表(hash table)实现,根据键查询、新增、删除操作平均时间复杂度为 O(1),查询效率极高。
  • 键 (key) 与值 (value) 规则
    • 键(key):必须是不可变数据类型(int、str、float、tuple);列表、字典、集合这类可变类型不能作为键;键具备唯一性,同一个字典不能出现重复 key,重复赋值会覆盖旧值。
    • 值(value):无限制,可以存放任意 Python 数据类型(数字、字符串、列表、字典、对象等)。
  • Python3.7+ 字典特性:会保留键值对插入顺序。
  • 二、字典三种遍历方式

    假设字典 d = {"a":1, "b":2, "c":3}

    1. 遍历所有键

    代码示例:

    for k in d.keys():
    print(k)

    运行结果:

    a
    b
    c

    简写:for k in d: 默认遍历键。

    2. 遍历所有值

    代码示例:

    for v in d.values():
    print(v)

    运行结果:

    1
    2
    3

    3. 同时遍历键和值(最常用)

    代码示例:

    for k, v in d.items():
    print(k, v)

    运行结果:

    a 1
    b 2
    c 3

    三、字典常用内置方法详解

    1. 查询:dict.get(key, default)

    • 作用:获取 key 对应的值。
    • 区别于 d[key]:
      • d[key]:key 不存在直接报错。
      • d.get(key, 默认值):key 不存在不会报错,返回给定的默认值;不写默认值则返回None。

    代码示例:

    d = {"a":10}
    print(d.get("a")) # 10
    print(d.get("b", 0)) # 键b不存在,返回0

    2. 删除操作

  • dict.pop(key):删除指定 key,返回被删除 key 对应的 value;key 不存在会报错。

    代码示例:

    val = d.pop("a")

  • dict.popitem():删除最后插入的一组键值对,并以元组 (key,value) 返回;空字典调用会报错。
  • dict.clear():清空字典内所有键值对,字典本身保留,变为空字典 {}。
  • 3. 新增 / 修改键值对

  • d[key] = value
    • key 存在:覆盖原有 value(修改)。
    • key 不存在:新增一组键值对。
  • dict.setdefault(key, value)
    • key 存在:不修改原有 value,直接返回旧值。
    • key 不存在:新增 key:value,返回 value。
  • 对比 d[key]=value:setdefault 不会覆盖已有数据。

    4. 合并字典 dict.update(其他字典)

    将参数字典里所有键值对合并进原字典;

    • 如果键重复:参数字典的值覆盖原字典的值。

    代码示例:

    d1 = {"a":1}
    d2 = {"b":2, "a":99}
    d1.update(d2)
    print(d1) # {'a': 99, 'b': 2}

    5. 快速创建字典 dict.fromkeys(可迭代对象, value)

    • 作用:构建全新字典。
    • 规则:可迭代对象内所有元素作为字典的键,所有键共用同一个 value。

    代码示例:

    d = dict.fromkeys(["a","b","c"], 0)
    print(d) # {'a':0, 'b':0, 'c':0}

    ⚠️ 坑提醒:value 如果是列表等可变对象,所有键共享同一个列表,修改一处全部变动。

    四、拓展高频考点(思维导图没有但是必考)

  • 成员判断 in:key in dict 判断键是否存在,不会匹配值;不要写成 value in dict(永远 False)。

    代码示例:

    d = {"a":1}
    print("a" in d) # True
    print(1 in d) # False

  • 字典属于可变类型,方法大部分原地修改,不返回新字典(除 get、pop 这类有返回值的)。
  • 字典不支持索引切片,只能通过 key 取值。
  • 五、方法速记区分

    方法key 存在key 不存在
    d[key] = val 覆盖原值 新增
    setdefault(key,val) 不修改原值 新增
    get(key,val) 返回值 返回默认值,不新增键

    tuple 元组

    一、核心特性

  • 数据类型:不可变序列 和字符串一样属于不可变类型,不能直接修改、新增、删除元组内部元素。
  • 注意:如果元组内嵌套列表 t = (1, [2,3]),元组本身不可变,但是内部列表里的元素可以修改。

  • 有序序列:支持索引、下标、切片操作。
  • 二、元组声明(重点易错点)

    1. 字面量创建

    t1 = () # 空元组
    t2 = (10,) # 只有单个元素,末尾逗号【不能省略】
    t3 = (1, 2, 3, "abc") # 多个元素,括号可以省略,逗号才是元组标识
    t4 = 1,2,3 # 等价 (1,2,3)

    高频: t = (5) 这不是元组!只是一个数字; t = (5,) 才是单元素元组。

    2. 类型转换 tuple(可迭代对象)

    把列表、字符串、集合等可迭代类型转为元组

    lst = [1,2,3]
    t = tuple(lst) # (1,2,3)
    s = "hello"
    t2 = tuple(s) # ('h','e','l','l','o')

    三、基础通用操作(思维导图未标出,必掌握)

  • 索引下标 正向索引 [0 ~ len(t)-1],支持负索引 -1 代表最后一位
  • t = (10,20,30)
    print(t[0]) # 10
    print(t[-1]) # 30

  • 切片 [start:stop:step] 规则和字符串、列表完全一致;切片返回新元组
  • t[1:]
    t[::-1] # 元组反转

  • 遍历
  • # 方式1 直接遍历元素
    for item in t:
    pass
    # 方式2 通过索引遍历
    for i in range(len(t)):
    print(t[i])

  • 成员判断  20 in (10,20,30) → True
  • 四、元组内置方法(仅有 2 个!)

    元组不可变,没有增删改方法,只有两个查询方法:

    1. tuple.count(元素)

    统计指定元素在元组中出现的次数

    t = (1,2,2,3)
    print(t.count(2)) # 2

    2. tuple.index(元素)

    • 功能:返回第一次匹配元素对应的索引下标
    • 风险:如果元素不存在,直接抛出 ValueError 报错

    t = (10,20,30)
    print(t.index(20)) # 1
    # t.index(99) 报错!

    五、拓展

    1. 元组不可变的深层理解

    t = (1, [2,3])
    # t[0] = 100 ❌ 报错,不能替换元组内元素
    t[1].append(4) # ✅ 合法!
    print(t) # (1, [2, 3, 4])

    原理:元组保存的是元素内存地址;地址不变就不算修改元组。列表地址没变,只是列表内部内容变化。

    2. 元组常用场景

  • 函数多个返回值本质就是元组
  • def func():
    return 10,20 # 等价 return (10,20)

  • 作为字典的键(列表不行,元组不可变可以)
  • 保护数据不被意外修改,数据安全场景
  • 3. 元组和列表相互转换

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

    六、元组 与 列表核心对比速记

    特性列表 list元组 tuple
    可变性 可变,可以增删改元素 不可变,无法直接修改元素
    符号 [] (),单元素必须带逗号
    内置方法 大量增删改查方法 仅 count、index 两个查询方法
    能否做字典 key ❌ 不可以 ✅ 可以

    set 集合

    一、核心基础特性

  • 无序:元素没有固定顺序,不支持索引、切片,无法通过下标取值。
  • 元素不重复:自动去重,最常用场景:对列表快速去重。
  • 元素要求:集合内元素必须是不可变数据类型(int、str、tuple);列表、字典、集合不能放入集合。
  • 分类:普通集合 set() 属于可变类型;还有不可变集合 frozenset(思维导图未提及)。
  • 二、集合定义与创建

  • 字面量语法:{元素1, 元素2, 元素3}
  • s = {1,2,3}

     易错点:{} 是空字典!空集合必须使用 set() 创建

    empty_set = set() # 空集合
    empty_dict = {} # 空字典

  • 类型转换 set(可迭代对象) 接收列表、字符串、元组等可迭代类型,自动去除重复元素:
  • lst = [1,2,2,3]
    s = set(lst) # {1,2,3}

    三、可变集合常用增删方法

    新增元素

  • set.add(item) 添加单个元素;元素已存在不会报错,集合无变化。
  • s.add(5)

  • set.update(可迭代对象) 批量添加多个元素(列表、元组、字符串等),把可迭代对象内元素逐个并入集合。
  • s.update([4,5,6])

    删除元素(重点区分 4 种删除)

  • set.pop() 随机删除一个元素(无序,无法指定),返回被删除元素;空集合调用会报错。
  • set.remove(item) 删除指定元素;元素不存在直接报错。
  • set.discard(item) 删除指定元素;元素不存在不会报错(日常开发优先推荐)。
  • set.clear() 清空集合内所有元素,变为空集合 set()。
  • 四、集合数学运算(核心考点)

    设两个集合:s1 = {1,2,3,4},s2 = {3,4,5,6}

    不带_update:返回新集合,原集合不变 带_update:原地修改原集合,无返回值

    运算方法说明
    交集 intersection() 同时存在于两个集合的元素
    交集更新 intersection_update() 原地保留交集,修改自身
    并集 union() `
    差集 difference() 存在于 A,不存在于 B 的元素
    差集更新 difference_update() 原地保留差集
    对称差集 symmetric_difference() 只在其中一侧出现的元素
    对称差更新 symmetric_difference_update() 原地修改为对称差集

    示例:

    s1 = {1,2,3,4}
    s2 = {3,4,5,6}
    print(s1.intersection(s2)) # {3,4}
    print(s1 & s2)

    print(s1.difference(s2)) # {1,2}
    print(s1 – s2)

    五、其他常用基础操作

  • 成员判断 in
  • 3 in {1,2,3} # True

  • 遍历 集合无序,遍历顺序不确定
  • for item in s:
    print(item)

  • 长度获取 len(set)
  • 六、高频应用场景

  • 列表去重
  • lst = [1,1,2,3]
    new_lst = list(set(lst))

    缺陷:集合无序,会打乱原有顺序;需要保序去重要换其他方案。 2. 数据对比:求交集(共同数据)、差集(独有数据)

    七、易混易错汇总

  • {} 是空字典,空集合只能写 set();
  • remove 和 discard 区别:不存在元素时,remove 报错,discard 静默处理;
  • pop 是随机删除,不能指定元素;
  • 集合无序,不能索引、不能切片;
  • 集合不能存放列表、字典这类可变对象;
  • update 接收可迭代对象,add 只能添加单个元素。
  • 赞(0)
    未经允许不得转载:171主机测评 » Python数据结构知识(三)dict 字典,tuple元组 ,set 集合
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址