写点什么

python 小知识 -set 妙用

作者:AIWeker
  • 2022-11-01
    福建
  • 本文字数:1116 字

    阅读完需:约 4 分钟

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 globdir_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 globdir_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 globdir_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 randomimport timedata3 = [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 的妙用对你有帮助

发布于: 11 小时前阅读数: 3
用户头像

AIWeker

关注

InfoQ签约作者 / 公众号:人工智能微客 2019-11-21 加入

人工智能微客(aiweker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
python小知识-set妙用_Python_AIWeker_InfoQ写作社区