第四章 字典 Dict(mapping)
00 min
2024-4-23
特点:花括号{}括起来,以键值对(key-value)形式存在用来存储,每一个键值对称为Item,也称为Entry;字典是可变的,无序的,key不重复的键值对集合。
对键的约束
  • 键是唯一的,不可能有两个元素具有相同的键
  • 键是不可变的,所以键不能是列表(键必须是不可变类型)

4.1 创建字典

使用 dict() 函数创建字典,可以传入多个列表或元组参数作为 key-value 对,每个列表或元组将被当成一个 key-value 对,因此这些列表或元组都只能包含两个元素

4.2 字典的基本操作

元素访问

  • d[key]
    • 返回key对应的值value
  • d.get(key[,defualt])
    • 返回key对应值value,不对字典本身修改
    • key不存在返回缺省值,如果没有缺省值就返回None
  • d.setdefualt(key[,default])
    • 返回key对应值value,对字典就地修改
    • key不存在,添加kv对,value为default,并返回default,如果没有default,缺省值为None

keys()、values()和 items()方法

keys()、values()和 items()方法分别返回字典的键,值,键值对。
上面方法返回的并非是列表,items返回的值是包含键值的元组。如果想要返回列表就需要把返回值传递给list函数。

元素增改

  • d[key] = value
    • 存在key,则将对应值改为value,不存在则新增键值对
  • d.update([other]) → None
    • 使用另一个字典的kv对来更新字典,就地修改
    • key存在就修改,key不存在就添加

元素判定

  • key [not] in d
    • 判定键key是否在字典d中

元素删除

  • del dict
    • 删除字典;标识符取消了,dict指向的字典对象引用计数减1,如果引用计数清0,gc清理
  • del dict[key]
    • 删除字典元素
  • dict.pop(key[,default])
    • 弹出kv对并返回value值
    • key不存在也没有缺省值会报错,key不存在有缺省值返回缺省值。
  • dict.popitem()
    • 随机弹出item,但不能为空,返回二元组(key,value)
  • dict.clear()
    • 清空字典内元素,返回空字典

元素遍历(重点)

Python3中,keys、values、items方法返回一个类似一个生成器的可迭代对象
  • Dictionary view对象,可以使用len()、iter()、in等操作
  • 字典的entry的动态的视图,字典变化,视图将反应出这些变化
  • keys方法返回一个类set对象,也就是可以看做一个set集合。如果values都可以hash,那么items也可以看作是类set对象
问题:遍历字典时删除不需要的kv对问题。
 

4.3 key理解

字典的key和set的元素要求一致
  • set的元素可以就是看作是key,set可以看作dict的简化版
  • hashable可哈希才可以作为key,可以使用hash()测试
  • 使用key访问,就如同列表使用index访问一样,时间复杂度都是O(1)
 

4.4 有序性(OrderedDict)和defaultdict

在Python 3中,字典在3.7开始,支持记录kv对中k的录入顺序功能,在此之前字典无序的在对字典进行遍历时,是按照字典中元素的录入顺序来遍历的。
在3.7之前为了解决字典的录入顺序问题,可以通过collections模块的OrderedDict类来解决。
在访问字典时,如果访问不存在的key会抛出异常,而通过collections模块的defaultdict类创建字典,在访问一个没有的key时不会抛出异常,而是返回一个默认值,这个默认值可以在创建defaultdict对象时指定,也可以使用默认值工厂函数来生成。这样可以避免在访问字典时需要先判断key是否存在,从而简化代码。
 

4.5嵌套

有时候需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。
比如:字典alien_0只包含一个外星人的信息,如何存储众多外星人信息

4.5.1列表嵌套字典

4.5.2字典嵌套列表

4.5.3字典嵌套字典

4.6 数据类型转换

  • int(x) 将字符串/浮点数转换成整数
  • float(x)将字符串/整数转换成一个浮点数
    • 1.浮点数与整数运算,Python会自动将整数转换成浮点数,得到浮点数结果
      2.圆整:round(8.5)的结果是8。Python圆整策略是:将小数部分为.5的数字圆整到最接近的偶数(银行家圆整)
      3.将字符串转换成整数/浮点数,int(x),float(x)假设他们看着像Python 整数/浮点数,如果不是这样,会出错
  • str(x)将对象x转换为字符串
  • tuple(s)将序列转换为一个元组
  • list(s)将序列转换成一个列表
  • eval(str)将字符串转换成相对应的数据类型