python小知识-set妙用

简介: python中提供了好用的数据结构,比如列表,字典和集合等。列表和字典是最常用的,而今天要分享的集合set也有独特的妙用

python中提供了好用的数据结构,比如列表,字典和集合等。列表和字典是最常用的,而今天要分享的集合set也有独特的妙用。

1.set的特性

首先我们来看看集合的特性,

  • 在集合中,所有元素都是不同
  • 集合是无序,所以不可索引
  • 集合和字字典一样都是都是hash存储,有利于查找
data = [1, 1, 1, 2, 3, 3, 3, 5]
print(set(data))
# {1, 2, 3, 5}

集合的常用操作有:

  • 交集: 求公共部分
  • 并集:合并两个集合,同时去重
  • 差集:不同的部分
data = [1, 1, 1, 2, 3, 3, 3, 5]
data2 = [2, 2, 5]
set1 = set(data)
set2 = set(data2)
print("union:", set1.union(set2))
print("intersection:", set1.intersection(set2))
print("difference:", set1.difference(set2))

# union: {1, 2, 3, 5}
# intersection: {2, 5}
# difference: {1, 3}

2.set妙用场景一

如果有两个文件夹,我们想筛查出两个文件夹中共同的部分,应该怎么写这个过程?

import glob
dir_name1 = './test1/'
dir_name2 = './test2/'

file_list1 = glob.glob('{}/*'.format(dir_name1))
file_list2 = glob.glob('{}/*'.format(dir_name2))

ret = []
for file1 in file_list1:
    for file2 in file_list2:
        if file1 == file2:
            ret.append(file1)

用列表来查找显然是效率低下的,时间复杂度O(N*M) N和M是列表的长度

另外一个用空间换时间,用字典

import glob
dir_name1 = './test1/'
dir_name2 = './test2/'

file_list1 = glob.glob('{}/*'.format(dir_name1))
file_list2 = glob.glob('{}/*'.format(dir_name2))

file_dict2 = { name: 0 for name in file_list2}
ret = []
for file1 in file_list1:
    if file_dict2.get(file1) is not None:
        ret.append(file1)

用字典的hash值直接查找效率是O(1), 只要扫一遍列表1, 复杂度为O(N)

如果用集合set呢?

import glob
dir_name1 = './test1/'
dir_name2 = './test2/'

file_list1 = glob.glob('{}/*'.format(dir_name1))
file_list2 = glob.glob('{}/*'.format(dir_name2))


ret = set(file_list1).union(file_list2)

更加简洁,时间复杂度平均为O(N+M)

3.set妙用场景二

set是hash结构存储的,所以只要set构建完成之后查找元素的效率是高于list的。

import random
import time
data3 = [i for i in range(100000000)]

t = time.time()
print(100000000 in data3)
print(time.time() - t)
# False
# 1.5218188762664795

set_data = set(data3)
t = time.time()
print(100000000 in set_data)
print(time.time() - t)
# False
# 0.0

上面的例子,印证了set的查询效率是高于list的;但是构建集合也是需要发时间的,所以比较适合频繁判断的情况(一次构建,多次查询)

希望set的妙用对你有帮助

目录
相关文章
|
2月前
|
存储 Python
Python多个set中的交集
Python多个set中的交集
25 1
|
2月前
|
并行计算 Python
Python错误笔记(一):CUDA initialization: CUDA unknown error - this may be due to an incorrectly set up env
这篇文章讨论了CUDA初始化时出现的未知错误及其解决方案,包括重启系统和安装nvidia-modprobe。
162 0
|
3月前
|
存储 数据处理 Python
Python中的Set集合:高效数据处理的利器
Python中的Set集合:高效数据处理的利器
52 0
|
4月前
|
索引 Python 容器
为什么Python中会有集合set类型?
为什么Python中会有集合set类型?
|
4月前
|
Python
python中set和frozenset方法和区别
python中set和frozenset方法和区别
|
4月前
|
JavaScript 前端开发 Python
成功解决:Can‘t find Python executable “python“, you can set the PYTHON env variable.
这篇文章分享了作者在运行前端Vue项目时遇到的关于Python执行环境的问题和解决方法。问题是由于找不到Python可执行文件导致的编译错误,解决方法包括安装编译环境、卸载并重新安装出现问题的`node-sass`包,并重新执行`npm install`和`npm run dev`。
成功解决:Can‘t find Python executable “python“, you can set the PYTHON env variable.
|
4月前
|
Python
python集合类型 (Set Types)
【8月更文挑战第3天】
81 9
|
4月前
|
测试技术 索引 Python
Python接口自动化测试框架(基础篇)-- 常用数据类型list&set()
本文介绍了Python中list和set两种数据类型的使用,包括它们的创建、取值、增删改查操作、排序以及内置函数的使用,还探讨了list的比较函数和set的快速去重功能。
36 0
|
4月前
|
SQL 机器学习/深度学习 算法
【python】python指南(八):静态类型注解之Set
【python】python指南(八):静态类型注解之Set
34 0
|
5月前
|
数据处理 Python
【Python】已解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFram
【Python】已解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFram
664 1