集合的运算
集合的概念你还记得的吗?
记得以前自学《普通逻辑》的时候研究的很明白,现在还能找到以前的笔记呢; 之后又自学《离散数学》对集合的各种操作了如指掌。然而时隔多年,除了一些非常非常基本的概念,基本都忘干净啦。先一起复习一下,为了搞明白,我可是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 中使用集合的差集功能,可以很优雅的找出谁没给我投票 处理一些技术问题,咳咳,言多必失,言多必失,这篇文章就此打住了。