字典与集合

字符串、列表、元组都是序列类型,其中的元素在位置上具有先后关系,所以可以使用位置来访问元素;而字典与集合是无序类型,不能使用位置来访问元素。

字典与元组的应用场景和主要进行的操作不同。字典是Python中唯一的映射类型,主要关注元素的检索、插入与删除;Python中的集合模拟的是数学上的集合,主要关注集合的并交差等运算。

字典dict

认识字典

  1. 字典是无序的键值对的集合体,使用键来检索相应的值。
  2. 字典的原理是对键进行哈希运算,根据计算的结果决定值的存储地址。所以字典的查询效率是很高的。
  3. 由于字典的原理是哈希表,所以要求键必须是可哈希的,即键必须是不可变类型。可以使用hash()函数计算哈希值来判断一个数据是否能作为字典的键:

    Untitled

  4. 字典的值可以是列表、元组、字典等复杂类型。

  5. 字典是可变类型,可以对其中的元素进行增删改等操作,比较灵活。

字典的操作

字典的创建

  1. 使用 字典名={键1:值1,键2:值2,……}的方式初始化一个字典。
  2. 使用 字典名={}的方式创建一个空字典,后续再向字典中插入键值对。
  3. 使用 dict()函数创建字典,这种方式比较灵活。

    • dict()的参数为空,返回一个空字典。
    • dict()的参数可以为一个n行2列的可迭代对象,返回一个具有n个键值对的字典。

      Untitled

    • dict()也可以接收 键=值 这样的参数,和第一种赋值方式区别不大。但字符串不能加引号。

字典的访问

  1. 使用 字典名[键]的方式可以访问对应的值。但是如果这个键不存在就会报错。
  2. 使用 字典名.get(键,symble)的方式访问对应的值。如果键不存在则返回symble这个值。

推荐使用get的方式来访问字典的值,这样更安全。后面还会了解到一些返回值的同时还会对元素进行修改的方法。

字典的更新

使用 字典名[键]=值 的方式对字典元素进行更新:

  • 如果键存在,则将旧值修改为新值
  • 如果键不存在,则将这个键值对插入字典中。

字典元素的删除

使用del删除字典元素或整个字典:

  1. del 字典名[键] 可以删除键值对。如果键不存在会报错。
  2. del 字典名 删除整个字典。

字典元素测试

使用innot in可以测试某个键是否在字典中,返回True或者False。它可以作为访问元素之前的操作,避免报错。

一些函数

  1. len()统计字典中元素的个数。
  2. max()min()获取字典键的最大值和最小值。
  3. sorted()将字典的键排序后以列表的形式返回,可以指定reverse参数。

字典的常用方法

  1. fromkeys()方法

    通常的格式为{}.fromkeys(seq,value),返回一个以seq中的元素作为键,value作为值的字典。如果value缺省则值为None。

    Untitled

  2. 获取键/值序列的方法

    • d.keys():返回字典d的键组成的列表
    • d.values():返回d的值组成的列表
    • d.items():返回以d的键值二元组为元素的列表
  3. 修改字典元素的方法

    • d.pop(key):删除对应的键值对并返回相应的值
    • d.popitem(key):删除键值对,返回键值二元组
    • d.setdefault(key,value):如果key存在,返回其值;如果不存在,将key:value插入字典,并返回value。

      这个方法比get方法多了键不存在时插入的处理。

    • d.update(d1):将字典d1合并到字典d中,d1本身不变。

字典的遍历

  1. 遍历字典的关键字

    1
    2
    3
    d={"x":2,"y":3,"z":4}
    for key in d.keys()
    print(key)
  2. 遍历字典的值

    1
    2
    3
    d={"x":2,"y":3,"z":4}
    for value in d.values()
    print(value)
  3. 遍历字典的键值对

    1
    2
    3
    d={"x":2,"y":3,"z":4}
    for key,value in d.items():
    print(key,value)

集合set

集合的可变集合和不可变集合两种,它们中的元素都是不可变的,就像字典的键一样。

集合的创建

  1. 使用{1,2,3,4}的方式创建一个非空集合。
  2. 使用set()创建一个空集合。

    不能是()[]{},因为它们分别代表空元组、空列表、空字典。

  3. 使用set(seq)将序列转化为集合。由于集合中的元素不能重复,所以可以达到去重的效果——这么操作效率很高。
  4. 使用frozenset()创建一个不可变集合。使用set创建的集合是可变的,而frozenset创建的集合不可变,所以可以作为其他集合的元素或字典的键。

集合的运算

传统的集合运算

  1. 并集

    s1 | s2 | … | sn:计算n个集合的并集,返回新集合。

  2. 交集

    s1 & s2 & … & sn:计算n个集合的jo集,返回新集合。

  3. 差集

    s1 - s2 - … - sn:将s1中不属于s2、s3、…、sn的元素作为新集合返回。

  4. 对称差集

    s1 ^ s2:将s1和s2相异的元素作为一个新集合返回。

  5. 相等

    s1 = s2s1 != s2:返回True或False。

  6. 真包含/包含

    s1 > s2s1 >= s2:s1真包含s2或s1包含s2。

  7. 真包含于/包含于

    s1 < s2s1 <= s2:s1真包含于s2或s1包含于s2。

  8. 属于/不属于

    x in sx not in s:x属于s或x不属于s。

集合的常用方法

主要是修改可变集合中元素的方法。

  1. s.add(x):向集合s中添加元素x。
  2. s.remove(x):从集合中删除x。如果x不存在,报错。
  3. s.discard(x):从集合中删除x。x不存在也不会报错。
  4. s.pop():任意删除一个元素并返回。
  5. s.update(s1,s2,…,sn):将s1,s2,…并入s中。

集合的遍历

使用for循环遍历集合中的元素即可。

1
2
3
s={1,2,3,4,5}
for i in s:
print(i)