集合操作(添加、删除、数据操作<不相交、子集、超集、并集、交集、差集、对称差集>)

添加操作

  • add(ele) 向集合中添加一个元素,如果元素存在则不产生任何影响
    s = {1, 2, 3}
    
    s.add(4)
    print(s)
    s.add("Hello")
    s.add("Hello")
    print(s)
    
  • update(others) 更新集合,添加来自 others 中的所有元素, others 是一个可迭代对象,如果数据在集合中存在则不更新。
    s = {1, 2, 3}
    
    s.update((4,5,6))
    print(s)
    s.update([5,6,7])
    print(s)
    s.update({6,7,8,9})
    print(s)
    

删除操作

  • pop() 从集合中移除并返回任意一个元素,如果集合为空,则抛出错误
    s = {1, 2, 3}
    
    print(s.pop())
    print(s)
    print(s.pop())
    print(s)
    print(s.pop())
    print(s)
    print(s.pop())
    
  • remove(elem) 从集合中移除元素 elem。 如果 elem 不存在于集合中则抛出错误。
    s = {1, 2, 3}
    
    print(s.remove(1))
    print(s)
    print(s.remove(3))
    print(s)
    print(s.remove(5))
    
  • discard(elem) 如果元素 elem 存在于集合中则将其移除,如果 elem 不存在,则什么也不做
    s = {1, 2, 3}
    
    s.discard(1)
    print(s)
    s.discard(3)
    print(s)
    s.discard(5)
    
  • clear() 清空集合
    s = {1, 2, 3}
    s.clear()
    print(s)
    

集合数据操作

判断两个集合是否不相交
  • isdisjoint(other) 如果集合中没有与 other 共有的元素则返回 True。 当且仅当两个集合的交集为空集合时,两者为不相交集合。
    s = {1, 2, 3}
    
    print(s.isdisjoint({4, 5, 6}))
    print(s.isdisjoint({3, 4, 5}))
    
判断集合是否是另一个集合的子集
  • issubset(other) 检测是否集合中的每个元素都在 other 之中。
    s = {1, 2, 3}
    
    # 判断 s 是否为 other参数的子集
    print(s.issubset({1, 2, 3}))
    print(s.issubset({1, 2, 3, 4}))
    print(s.issubset({3, 4, 5}))
    print("*" * 10)
    # 也可以通过运算符 <= 直接判断
    print(s <= {1, 2, 3})
    print(s <= {1, 2, 3, 4})
    print(s <= {3, 4, 5})
    print("*" * 10)
    
    # 判断是否为真子集
    print(s < {1, 2, 3})
    print(s < {1, 2, 3, 4})
    print(s < {3, 4, 5})
    
判断集合是否是另一个集合的超集
  • issuperset(other) 检测是否 other 中的每个元素都在集合之中。
    s = {1, 2, 3, 4}
    
    # 判断 s 是否为 other参数的超集
    print(s.issuperset({1, 2, 3}))
    print(s.issuperset({1, 2, 3, 4}))
    print(s.issuperset({3, 4, 5}))
    print("*" * 10)
    # 也可以通过运算符 >= 直接判断
    print(s >= {1, 2, 3})
    print(s >= {1, 2, 3, 4})
    print(s >= {3, 4, 5})
    print("*" * 10)
    
    # 判断是否为真超集
    print(s > {1, 2, 3})
    print(s > {1, 2, 3, 4})
    print(s > {3, 4, 5})
    
并集
  • union(*other) 返回一个新集合,其中包含来自原集合以及 others 指定的所有集合中的元素,other 可以指定多个集合。
    s1 = {1, 2, 3, 4}
    s2 = {3, 4, 5, 6}
    s3 = {5, 6, 7, 8}
    print(s1.union(s2))
    print(s1.union(s2,s3))
    # 也可以使用 | 进行集合并集运算
    print(s1 | s2)
    print(s1 | s2 | s3)
    
交集
  • intersection(*others) 返回一个新集合,其中包含原集合以及 others 指定的所有集合中共有的元素。
    s1 = {1, 2, 3, 4}
    s2 = {3, 4, 5, 6}
    s3 = {5, 6, 7, 8}
    print(s1.intersection(s2))
    print(s1.intersection(s2, s3))
    print(s1.intersection(s3))
    print("*" * 10)
    # 也可以使用 & 进行集合交集运算
    print(s1 & s2)
    print(s1 & s2 & s3)
    print(s1 & s3)
    
差集
  • difference(*others) 返回一个新集合,包含原集合中在 others 指定的其他集合中不存在的元素。
    s1 = {1, 2, 3, 4}
    s2 = {3, 4, 5, 6}
    s3 = {5, 6, 7, 8}
    print(s1.difference(s2))
    print(s1.difference(s2, s3))
    print(s1.difference(s3))
    print("*" * 10)
    # 也可以使用 - 进行集合差集运算
    print(s1 - s2)
    print(s1 - s2 - s3)
    print(s1 - s3)
    
对称差集
  • symmetric_difference(other) 返回一个新集合,其中的元素或属于原集合或属于 other 指定的其他集合,但不能同时属于两者。
    s1 = {1, 2, 3, 4}
    s2 = {3, 4, 5, 6}
    s3 = {5, 6, 7, 8}
    print(s1.symmetric_difference(s2))
    print(s1.symmetric_difference(s3))
    print("*" * 10)
    # 也可以使用 ^ 进行集合对称差集运算
    print(s1 ^ s2)
    print(s1 ^ s3)
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是用C语言实现集合运算的代码,其中包括注释解释每个函数的作用: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> // 定义集合的最大元素数量 #define MAX 100 // 定义集合结构体 typedef struct { int set[MAX]; // 集合中的元素 int size; // 集合中元素数量 } Set; // 从键盘输入集合元素 void inputSet(Set *s) { printf("请输入集合元素数量:\n"); scanf("%d", &s->size); printf("请输入集合元素(空格隔开):\n"); for (int i = 0; i < s->size; i++) { scanf("%d", &s->set[i]); } } // 输出集合元素 void outputSet(Set s) { printf("{ "); for (int i = 0; i < s.size; i++) { printf("%d ", s.set[i]); } printf("}\n"); } // 判断元素x是否在集合s中 int isElementOf(int x, Set s) { for (int i = 0; i < s.size; i++) { if (x == s.set[i]) { return 1; } } return 0; } // 求两个集合并集 Set unionSet(Set s1, Set s2) { Set res; res.size = 0; // 遍历s1中的元素,加入结果集合 for (int i = 0; i < s1.size; i++) { if (!isElementOf(s1.set[i], res)) { res.set[res.size++] = s1.set[i]; } } // 遍历s2中的元素,加入结果集合 for (int i = 0; i < s2.size; i++) { if (!isElementOf(s2.set[i], res)) { res.set[res.size++] = s2.set[i]; } } return res; } // 求两个集合交集 Set intersectionSet(Set s1, Set s2) { Set res; res.size = 0; // 遍历s1中的元素,如果在s2中也存在,则加入结果集合 for (int i = 0; i < s1.size; i++) { if (isElementOf(s1.set[i], s2)) { res.set[res.size++] = s1.set[i]; } } return res; } // 求两个集合差集 Set differenceSet(Set s1, Set s2) { Set res; res.size = 0; // 遍历s1中的元素,如果不在s2中,则加入结果集合 for (int i = 0; i < s1.size; i++) { if (!isElementOf(s1.set[i], s2)) { res.set[res.size++] = s1.set[i]; } } return res; } // 求一个集合的幂集 void powerSet(Set s) { // 幂集元素数量为2^n,n为集合元素数量 int size = pow(2, s.size); // 用二进制位表示集合元素是否在子集中 for (int i = 0; i < size; i++) { printf("{ "); for (int j = 0; j < s.size; j++) { // 如果第j个元素在子集中,则输出 if (i & (1 << j)) { printf("%d ", s.set[j]); } } printf("}\n"); } } // 求一个集合的任意m元子集 void mSubset(Set s, int m) { // 子集元素数量为m int size = pow(2, s.size); // 用二进制位表示集合元素是否在子集中 for (int i = 0; i < size; i++) { // 统计子集元素数量 int count = 0; for (int j = 0; j < s.size; j++) { if (i & (1 << j)) { count++; } } // 如果子集元素数量等于m,则输出 if (count == m) { printf("{ "); for (int j = 0; j < s.size; j++) { if (i & (1 << j)) { printf("%d ", s.set[j]); } } printf("}\n"); } } } int main() { Set s1, s2, res; int m; inputSet(&s1); inputSet(&s2); printf("集合1:"); outputSet(s1); printf("集合2:"); outputSet(s2); printf("并集:"); res = unionSet(s1, s2); outputSet(res); printf("交集:"); res = intersectionSet(s1, s2); outputSet(res); printf("差集(s1-s2):"); res = differenceSet(s1, s2); outputSet(res); printf("幂集:\n"); powerSet(s1); printf("请输入任意m元子集中的m:\n"); scanf("%d", &m); printf("%d元子集:\n", m); mSubset(s1, m); return 0; } ``` 运行上述代码后,可以输入集合元素,然后实现集合交集并集差集、幂集、任意m元子集的求解,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值