python中的集合和字典

集合(set)和字典(dict)是 Python 中两种常用的内建数据结构,它们都基于哈希表(hash table)实现,具有一些相似的特性,但也有显著的不同。下面是它们的详细比较:

1. 数据存储形式

  • 集合(set

    • 存储的是无序的、唯一的元素。集合中的每个元素必须是可哈希的,并且没有重复的值。
    • 示例:
       

      python

      复制代码

      s = {1, 2, 3, 4} # 集合中的元素是唯一的

  • 字典(dict

    • 存储的是键值对(key-value pairs)。字典中的每个元素都是一个映射,包含一个键(key)和一个值(value)。
    • 键(key)是唯一的,且必须是可哈希的,而值(value)可以是任意类型,且可以重复。
    • 示例:
       

      python

      复制代码

      d = {'a': 1, 'b': 2, 'c': 3} # 键值对,其中 'a'、'b'、'c' 是键,1、2、3 是对应的值

2. 操作与功能

  • 集合(set

    • 集合没有键值对,只能存储元素。常见操作有:
      • 添加元素:add()
      • 删除元素:remove()discard()
      • 计算集合的并集、交集、差集等:例如 union(), intersection(), difference() 等。
      • 查找元素是否存在:in 运算符。

    示例:

     

    python

    复制代码

    s = {1, 2, 3} s.add(4) # 添加元素 s.remove(2) # 删除元素 print(3 in s) # 检查元素是否在集合中,返回 True

  • 字典(dict

    • 字典存储键值对,可以根据键访问、修改或删除对应的值。常见操作有:
      • 添加键值对:通过赋值操作 d[key] = value
      • 删除键值对:del d[key]pop()
      • 获取值:get(key)(如果键不存在时不会抛出异常,返回 None 或指定的默认值)。
      • 查找键是否存在:in 运算符。

    示例:

     

    python

    复制代码

    d = {'a': 1, 'b': 2} d['c'] = 3 # 添加新的键值对 del d['b'] # 删除键 'b' print('a' in d) # 检查键 'a' 是否在字典中,返回 True print(d.get('c')) # 获取键 'c' 的值,返回 3

3. 元素访问

  • 集合(set

    • 集合没有索引,不能通过索引或位置访问元素,只能遍历集合。访问操作仅能判断元素是否存在。
    • 示例:
       

      python

      复制代码

      s = {1, 2, 3} print(1 in s) # 检查元素 1 是否在集合中,返回 True

  • 字典(dict

    • 字典允许通过键来访问对应的值。
    • 示例:
       

      python

      复制代码

      d = {'a': 1, 'b': 2} print(d['a']) # 通过键 'a' 访问值,返回 1

4. 重复元素

  • 集合(set

    • 集合中的元素必须是唯一的。如果尝试添加重复的元素,集合不会改变。
    • 示例:
       

      python

      复制代码

      s = {1, 2, 3} s.add(2) # 试图添加重复的元素 2 print(s) # 输出 {1, 2, 3},集合不会包含重复元素

  • 字典(dict

    • 字典中的键(key)必须是唯一的。如果尝试添加重复的键,会更新该键对应的值,而不会增加新的键值对。
    • 示例:
       

      python

      复制代码

      d = {'a': 1, 'b': 2} d['a'] = 3 # 键 'a' 的值被更新为 3 print(d) # 输出 {'a': 3, 'b': 2}

5. 性能

  • 集合(set

    • 集合在添加、查找、删除元素时的时间复杂度通常是 O(1),因为它基于哈希表实现。
    • 集合只存储元素,没有关联的值,因此它适用于需要去重或进行集合运算(如并集、交集等)时。
  • 字典(dict

    • 字典在查找、插入和删除键值对时的时间复杂度也是 O(1)(在哈希表没有冲突的情况下)。
    • 字典适用于需要通过键快速访问值的场景。

6. 应用场景

  • 集合(set
    • 用于需要确保元素唯一的情况,比如去重、集合运算(并集、交集、差集)、检查元素是否存在等。
    • 例如,在求交集、并集等操作时,可以使用集合。
  • 字典(dict
    • 用于需要存储键值对的数据结构,例如快速查找、映射、存储配置信息、数据库等。
    • 字典在构建索引、缓存、计数等应用中非常有用。

7. 空集合和空字典的定义

  • 空集合

    • 创建一个空集合时,需要使用 set(),因为 {} 是空字典的语法。
    • 示例:
       

      python

      复制代码

      empty_set = set() # 创建一个空集合

  • 空字典

    • 创建一个空字典时,使用 {}dict()
    • 示例:
       

      python

      复制代码

      empty_dict = {} # 创建一个空字典

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return list(set(nums1) & set(nums2))

 

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
    # 使用哈希表存储一个数组中的所有元素
        table = {}
    #遍历 nums1 中的每个元素 num。table.get(num, 0) 获取 num 在字典 table 中的当前计数(如果num 不在字典中,则默认值为 0)。将 num 对应的计数值加 1,并更新字典 table 中的该值
        for num in nums1:
            table[num] = table.get(num, 0) + 1
        
        # 使用集合存储结果
        res = set()
        for num in nums2:
            if num in table:
                res.add(num)
#set中没有重复的元素即使重复添加num set也只会有一个num 所以下面这一行不是必须的
                del table[num]
        
        return list(res)

你可能感兴趣的:(笔记)