当前位置:首页>python>Python第十天:集合自动去重超省心,判断元素比列表快100倍,对比C语言太高效

Python第十天:集合自动去重超省心,判断元素比列表快100倍,对比C语言太高效

  • 2026-09-02 19:32:00
Python第十天:集合自动去重超省心,判断元素比列表快100倍,对比C语言太高效

大家好,我是一个工作20多年的老程序员,把自己工作中积累的经验慢慢给大家分享

-begin-

在处理数据时,经常需要确保集合中没有重复的元素,比如统计参与活动的用户ID、去重商品名称等。列表和元组都允许元素重复,这时候集合(Set)就派上用场了——它会自动去除重复元素,而且支持快速判断元素是否存在,操作起来比列表更高效。C语言中没有内置集合类型,通常需要用数组配合循环去重,代码繁琐且效率低,而Python的集合天生支持去重和集合运算,非常适合这类场景。

第十天:集合(Set)——自动去重的“无序集合”

Python例子:

# 创建集合(用大括号{},元素之间用逗号分隔,或用set()函数)

fruits = {"苹果", "香蕉", "橙子", "苹果"}  # 包含重复元素

numbers = set([1, 2, 3, 2, 1])  # 用set()将列表转成集合,自动去重

# 输出集合(自动去重,且无序)

print("fruits集合:", fruits)  # 可能输出 {'苹果', '香蕉', '橙子'}(顺序不固定)

print("numbers集合:", numbers)  # 可能输出 {1, 2, 3}

# 添加元素

fruits.add("葡萄")

print("添加葡萄后的fruits:", fruits)  # 新增'葡萄'

# 删除元素

fruits.remove("香蕉")  # 删除指定元素,不存在会报错

print("删除香蕉后的fruits:", fruits)

fruits.discard("西瓜")  # 删除指定元素,不存在不报错

print("尝试删除西瓜后的fruits:", fruits)  # 无变化

# 判断元素是否存在

print("苹果是否在fruits中:", "苹果" in fruits)  # True

# 集合运算(交集、并集、差集)

a = {1, 2, 3, 4}

b = {3, 4, 5, 6}

print("交集(a和b都有的元素):", a & b)  # {3, 4}

print("并集(a或b有的元素):", a | b)  # {1, 2, 3, 4, 5, 6}

print("差集(a有而b没有的元素):", a - b)  # {1, 2}

运行结果:

fruits集合: {'橙子', '苹果', '香蕉'}

numbers集合: {1, 2, 3}

添加葡萄后的fruits: {'橙子', '苹果', '香蕉', '葡萄'}

删除香蕉后的fruits: {'橙子', '苹果', '葡萄'}

尝试删除西瓜后的fruits: {'橙子', '苹果', '葡萄'}

苹果是否在fruits中: True

交集(a和b都有的元素): {3, 4}

并集(a或b有的元素): {1, 2, 3, 4, 5, 6}

差集(a有而b没有的元素): {1, 2}

详细分析:

1.创建集合:用{}直接创建,或用set(可迭代对象)(如列表、元组)转换。集合的最大特点是自动去重和无序性(元素没有固定顺序,每次输出可能不同),这和列表、元组的有序性有本质区别。
2.添加与删除元素:
◦add(元素):向集合中添加一个元素,如果元素已存在则不做任何操作。
◦remove(元素):删除指定元素,若元素不存在会报错,需谨慎使用。
◦discard(元素):删除指定元素,若元素不存在也不会报错,比remove更安全。
3.元素判断:用元素 in 集合判断元素是否存在,由于集合底层用哈希表实现,判断速度比列表快得多(尤其是数据量大时)。
4.集合运算:
◦交集(a & b):两个集合中都存在的元素。
◦并集(a | b):两个集合中所有的元素(去重后)。
◦差集(a - b):集合a中有而集合b中没有的元素。

这些运算在处理数据交集、合并等场景非常实用,比如找出两个班级都参加活动的学生。

对比C语言:

C语言需手动实现去重和集合功能,以去重为例:

#include <stdio.h>

#include <stdbool.h>

// 判断元素是否在数组中

bool isInArray(int arr[], int len, int target) {

   for (int i = 0; i < len; i++) {

       if (arr[i] == target) {

           return true;

       }

   }

   return false;

}

// 数组去重(返回去重后的长度)

int removeDuplicates(int arr[], int len, int result[]) {

   int res_len = 0;

   for (int i = 0; i < len; i++) {

       if (!isInArray(result, res_len, arr[i])) {

           result[res_len++] = arr[i];

       }

   }

   return res_len;

}

int main() {

   int numbers[] = {1, 2, 3, 2, 1};

   int len = sizeof(numbers) / sizeof(numbers[0]);

   int result[len];  // 存放去重后的结果

   int res_len = removeDuplicates(numbers, len, result);

   printf("去重后的数组:");

   for (int i = 0; i < res_len; i++) {

       printf("%d ", result[i]);  // 1 2 3

   }

   return 0;

}

主要区别:

5.去重能力:Python集合创建时自动去重,无需额外代码;C语言需要手动写循环和判断,代码量大且效率低(时间复杂度为O(n²))。
6.元素顺序:Python集合是无序的,不保证元素的存储顺序;C语言数组是有序的,去重后仍保持原有的相对顺序(如果实现时保留)。
7.操作效率:Python集合的元素判断、添加、删除操作效率高(O(1));C语言数组的这些操作需要遍历,效率随数据量增长而下降。
8.功能丰富度:Python集合内置交集、并集等运算;C语言需要手动实现这些逻辑,复杂度高,容易出错。
-end-

如果文章对你有提升,帮忙点赞,分享,关注。非常感谢

最新文章

随机文章