Python程序中使用集合计算简化问题处理

集合的运算

集合的概念你还记得的吗?
记得以前自学《普通逻辑》的时候研究的很明白,现在还能找到以前的笔记呢; 之后又自学《离散数学》对集合的各种操作了如指掌。然而时隔多年,除了一些非常非常基本的概念,基本都忘干净啦。先一起复习一下,为了搞明白,我可是20年前的古书都翻了出来。

集合的常见运算:

  • 交(Intersection): A∩B={x|x∈A 且x∈B}
  • 并(Union): A∪B={x|x∈A 或x∈B}
  • 补(Supplement): A-B={x|x∈A 且x∉B}

其中补集又可以叫做差集,又分为相对补集和绝对补集,但是不影响我们要讨论的事情,所以不去详谈,感兴趣的可以自行去了解。

用在何处

既然我之前都说忘干净了,还翻出来干啥啊?集合有啥用呢?

引用百度百科集合条目中的一段话;

集合在数学领域具有无可比拟的特殊重要性。集合论的基础是由德国数学家康托尔在19世纪70年代奠定的,经过一大批卓越的科学家半个世纪的努力,到20世纪20年代已确立了其在现代数学理论体系中的基础地位,可以说,现代数学各个分支的几乎所有成果都构筑在严格的集合理论上。

额,好吧,我都看晕了,我又不研究数学,其实是和STEEMIT相关啦。

假设我有一些用户账户 A, B, C, D, E,F
那么我可以把他们看作一个集合 USERS
即: USERS = {A, B, C, D, E,F}
(数学表示,非代码)

然后,一个帖子, @oflyhigh/test_1_2_3
用户A、B、C、H、I、J,给我的这个帖子点赞,那么这些点赞者,我可以看作一个集合 VOTERS
即: VOTERS = {A, B, C, H, I, J}
(数学表示,非代码)

那么问题来,我想知道USERS中谁没给我点赞,该怎么办呢?
之前的处理方法,是使用两个列表,一个list_user, 一个list_voter
然后循环list_user中的元素,判断是否在list_voter中

先不说效率啥的,我感觉不优雅。不过好在能用。
于是我就想能不能换一种至少看起来优雅的方法呢?


仔细一想,这不就是差集嘛( B:USERS; A: VOTERS)

Python 对集合的支持

非常幸运的是,Python对集合运算提供了非常好的支持


来源: https://docs.python.org/2/library/sets.html#sets.Set

其中差集: new set with elements in s but not in t,即是我们想要的东东啦
操作比我们想象的还要简单

代码

好了,现在来一段具体的代码演示一下
假设我已经拿到了 @oflyhigh/test_1_2_3 这个帖子的投票者列表
那么就用这段代码找一下谁没给我投票吧,哼 😕

list_user = ['oflyhigh', 'deanliu', 'ace108', 'laodr', 'rivalhw', 'lemoojiang']
list_voter = ['oflyhigh', 'ace108', 'laodr']
list_x = list(set(list_user) - set(list_voter))
print(list_x)

(中间使用了set将列表转换成集合,你也可以直接用集合)

好啊, @deanliu, @rivalhw, @lemoojiang, 竟然不给我@oflyhigh/test_1_2_3 这个帖子投票
被我抓出来了吧 😕

结论

在Python 中使用集合的差集功能,可以很优雅的找出谁没给我投票 处理一些技术问题,咳咳,言多必失,言多必失,这篇文章就此打住了。

参考链接

H2
H3
H4
3 columns
2 columns
1 column
45 Comments