Python 中的 Set (集合) 是什么?

在 Python 中,Set(集合) 是一种-无序-不重复的数据结构。-它类似于数学中的集合,用于存储唯一的值。-可以同时储存不同资料型态

集合的主要特点是:

-无序:Set 中的每个元素没有特定的顺序,这意味着不能通过索引(像列表那样)来访问元素。-唯一性:Set 中的每个元素都是唯一的,重复的值会自动被过滤掉。-可变:Set 本身是可变的,可以增加或删除元素,但 Set 中的元素必须是不可变的(如整数、字串、元组等)。

如何创建 Set

  • 使用set()创建空集合
  • empty_set = set()
    print(empty_set) # Output: set()

  • 宣告变数后 使用{}函数来直接赋值。
  • # 创建一个 Set,并自动去除重复元素
    my_set = {1, 2, 3, 4, 5, 5}
    print(my_set) # Output: {1, 2, 3, 4, 5}

    #可以同时储存不同资料型态
    multipleType ={ 2,\'apple\',False}

    所以一定要用set()来建立集合?不一定要先用 set() 来创建一个集合。你可以直接使用大括号 {} 来创建一个集合并初始化其元素。但是,如果你想创建空集合,就必须使用 set(),因为 {} 会被解释为空字典。这是唯一的情况需要用到 set() 函数来明确创建集合。

    # 创建空集合,必须用 set()
    empty_set = set()
    print(empty_set) # Output: set()

    # 注意:如果你用 {} 创建,会得到空字典
    empty_dict = {}
    print(type(empty_dict)) # Output: <class \'dict\'>

    所以只有当你需要创建空集合时,才必须使用 set()。其他情况下,直接使用 {} 并填入元素即可。

  • Set推导式Comprehension集合推导式的语法和用法与列表推导式和字典推导式非常相似。{expression for item in iterable if condition}
    • expression: 要添加到集合中的元素。
    • item: 迭代变量。
    • iterable: 可迭代对象。
    • condition: 可选的过滤条件。

    # 创建一个包含 1 到 10 的平方数的集合
    squares = {x**2 for x in range(10)}
    print(squares) # 输出:{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

    # 创建一个包含字符串 \'hello\' 中所有唯一字母的集合
    unique_letters = {char for char in \'hello\'}
    print(unique_letters) # 输出:{\'h\', \'e\', \'l\', \'o\'}

    # 创建一个包含 1 到 20 之间所有偶数的集合
    even_numbers = {x for x in range(20) if x % 2 == 0}
    print(even_numbers) # 输出:{0, 2, 4, 6, 8, 10, 12, 14, 16, 18}

    集合推导式与列表推导式的差别

    • 元素唯一性: 集合中的元素是唯一的,因此集合推导式会自动移除重复元素。
    • 无序性: 集合是无序的,集合推导式的结果元素顺序可能与原始可迭代对象的顺序不同。

    为什么要使用集合推导式?

    • 快速建立集合: 可以有效率地建立集合,特别是从其他可迭代对像中提取唯一元素。
    • 简洁的语法: 比传统的 for 循环方式更简洁。
    • 可读性高: 对于简单的操作,集合推导式具有较高的可读性。

    应用场景

    • 去除重复元素: 从列表或其他可迭代物件中快速移除重复元素。
    • 建立集合: 根据条件快速建立包含特定元素的集合。
    • 集合运算: 可以结合其他集合运算子(如交集、并集、差集)进行更复杂的集合运算。

    可以将多种可迭代物件转换为集合(set),常见的有:

    -列表 (list)-元组 (tuple)-字串 (string)-字典 (dictionary)(只会取字典的键)-集合 (set) 本身(这是拷贝的方式)-范围 (range)

    可迭代物件类型
    范例
    转换为集合的范例
    输出结果
    列表 (list) [\'apple\', \'banana\', \'orange\'] set([\'apple\', \'banana\', \'orange\']) {\'apple\', \'banana\', \'orange\'}
    元组 (tuple) (\'apple\', \'banana\', \'orange\') set((\'apple\', \'banana\', \'orange\')) {\'apple\', \'banana\', \'orange\'}
    字串 (string) "apple" set("apple") {\'a\', \'e\', \'p\', \'l\'}
    字典 (dictionary) {\'apple\': 1, \'banana\': 2, \'orange\': 3} set({\'apple\': 1, \'banana\': 2, \'orange\': 3}) {\'apple\', \'banana\', \'orange\'}
    集合 (set) {\'apple\', \'banana\', \'orange\'} set({\'apple\', \'banana\', \'orange\'}) {\'apple\', \'banana\', \'orange\'}
    范围 (range) range(1, 5) set(range(1, 5)) {1, 2, 3, 4}

    常用 Set 操作

    my_set ={1,2,3}

    操作
    描述
    范例
    add() 将一个元素添加到集合中 my_set.add(6)->{1,2,3,6}
    remove() 从集合中移除指定元素,若元素不存在则报错 my_set.remove(3)-> {1,2,6}
    discard() 从集合中移除指定元素,若元素不存在则不报错 my_set.discard(10)
    clear() 移除集合中的所有元素 my_set.clear()->{}
    in 检查某个元素是否存在于集合中 my_set = {1,2,3,4} print(3 in my_set )→ True
    not in 检查某个元素没有存在于集合中 my_set = {1,2,3,4} print(4 in my_set )→ false
    函数
    描述
    范例
    len(iterable) 返回可迭代对象的元素个数。 len({1, 2, 3, 4, 5}) 返回 5
    sum(iterable, start=0) 返回可迭代对象中所有元素的总和,start 为可选参数,表示总和的起始值(默认为 0)。 sum({1, 2, 3, 4, 5}) 返回 15
    max(iterable, *[, key]) 返回可迭代对象中的最大值,key 为可选参数,用于指定自定义的比较函数。 max({1, 2, 3, 4, 5}) 返回 5
    min(iterable, *[, key]) 返回可迭代对象中的最小值,key 为可选参数,用于指定自定义的比较函数。 min({1, 2, 3, 4, 5}) 返回 1

    解析 max(iterable, *[, key])

    1.iterable:-这是函数的第一个参数,表示一个可迭代对象(例如列表、元组或集合)。函数将在这个可迭代对象中查找最大值。

    2.*:-星号 * 表示后面的参数是可变长度的,也就是说,你可以传递多个额外的位置参数。这意味着你可以将多个可迭代对象一起传递给 max() 函数。例如:max(set1, set2)。

    3.[, key]:-方括号 [] 表示这个参数是可选的。在这里,key 是一个可选的参数,它允许你指定一个函数,用来从每个元素中提取比较的值。这个函数将应用于可迭代对象中的每个元素,以确定哪个元素是最大的。-例如,如果你有一个由元组组成的可迭代对象,你可以使用 key 参数来指定根据元组的第二个元素来找到最大值。

    # 基本用法
    numbers = {1, 3, 2, 5, 4}
    maximum = max(numbers) # 返回 5

    # 使用可变参数
    max_of_multiple_sets = max({1, 2}, {3, 4}) # 返回 4,因为 4 是所有集合中的最大值

    # 使用 key 参数
    tuples = [(1, 2), (3, 1), (2, 3)]
    # 找到元组中第二个元素最大的元组
    max_tuple = max(tuples, key=lambda x: x[1]) # 返回 (2, 3)

    lambda 表达式

    -基本语法:lambda arguments: expression-这里的 arguments 是你想传递给匿名函数的参数,expression 是该函数的返回值。-lambda 函数的特点是它不需要名称(即匿名),并且只能包含单个表达式。

    key=lambda x: x[1] 的解释

    -在这个上下文中,key 是用于指定一个函数的参数。这个函数会被应用到可迭代对象的每个元素上,以决定如何进行比较。-lambda x: x[1] 则表示这个函数接收一个参数 x,并返回 x 的第二个元素(即索引为 1 的元素)。因此,这里 x 通常是一个可迭代对象中的单个元素,比如元组、列表等。

    tuples = [(1, 2), (3, 1), (2, 3)]
    max_tuple = max(tuples, key=lambda x: x[1]) # 返回 (2, 3)
    每个元组包含两个元素,索引分别为 0 和 1:

    第一个元组 (1, 2) 的第一个元素是 1,第二个元素是 2。
    第二个元组 (3, 1) 的第一个元素是 3,第二个元素是 1。
    第三个元组 (2, 3) 的第一个元素是 2,第二个元素是 3。
    然后,max() 函数会根据这些提取的值来找出最大的:
    比较 2、1 和 3,显然 3 是最大的。
    因此,max(tuples, key=lambda x: x[1]) 返回的结果是 (2, 3),因为该元组的第二个元素 3 是所有元组中最大的。

    集合交集、差集、联集和反差集

    set1 ={1,2,3} set2={3,4,5}

    操作
    描述
    范例
    联集union() or (set1 | set2) 返回两个集合的联集(所有元素的集合) set1.union(set2)->{1,2,3,3,4,5} print(set1|set2)->{1,2,3,3,4,5}
    交集intersection() or set1&set2 返回两个集合的重复/共同的元素 set1.intersection(set2)->{3}print(set1&set2)->{3}
    反差集(set1^set2) 取不重复值(扣除重复) print(set1^set2)->{1,2,4,5}
    差集difference()or (set1-set2) 返回存在于第一个集合但不存在于第二个集合的元素 set1.difference(set2)->{1,2} print(set1-set2)->{1,2}
    子集issubset() 如果set1所有元素都存在于另一个set2集合中则返回 True,否则返回 False set1 = {1, 2}set2 = {1, 2, 3, 4}result = set1.issubset(set2) # True
    超集:issuperset() 如果set2集合的所有元素都存在set1集合中,则返回 True,否则返回 False。 set1 = {1, 2, 3, 4}set2 = {1, 2}print(result)set1.issuperset(set2) # True