集合的运算
集合的概念你还记得的吗?
记得以前自学《普通逻辑》的时候研究的很明白,现在还能找到以前的笔记呢; 之后又自学《离散数学》对集合的各种操作了如指掌。然而时隔多年,除了一些非常非常基本的概念,基本都忘干净啦。先一起复习一下,为了搞明白,我可是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 中使用集合的差集功能,可以很优雅的找出谁没给我投票 处理一些技术问题,咳咳,言多必失,言多必失,这篇文章就此打住了。
哈哈,這個也太好玩吧。誰沒有給我點贊站出來。 XD.
想到了一個點子做CN 區的小遊戲XD。
😄👏
建议来个安装Python的教程还有如何把STEEM,PISTON等等安装进电脑。因为我遇到的情况是一个问题解决了又来一个问题。
Windows 8.1 64Bit
安装教程一堆啊 😄
百度一下你就知道
邏輯是有看有懂,代碼是明白但不懂寫,看來要惡補 python 了....汗
代码超简单啦
努力學習...
o哥很有心啊,教大家之前還專門翻書複習
Python真的很好用,基本的代碼不難,但要寫出有效率的代碼還真是一門藝術 (我還在努力學這部份 哈哈)
謝謝指教了
😄 谢谢夸奖
其实我写代码很滥的
所以要努力学习
一起努力 ~
抱歉,抱歉,一時疏忽,趕緊把網址放上來,馬上補點!Sorry!!
哼哼,我很记仇的 💢
补点?晚了!
難道?難道,寄給你100 SBD,你就有可能原諒我麼?我想是不可能的,我還是打消這個荒謬的念頭好了....
😄那肯定是可以原谅的啦
其实也不用那么多啦,98SBD 就好啦
我不相信!要是真的能原諒,1000 sbd都不是問題!但我已絕望....
😭 真的只有98, 哦, 88 SBD, 就可以原谅的啦
不可能!這麼大的傷害,再多錢都彌補不了!
代码是看懂了,就是不知道这个list_user怎么得到 哈哈,我用上了我所有了编程知识了。:)
PS 我可是点赞了哟
哼哼,点没点赞以后以我代码算出来的为准 😄
即便我看到你在下拉列表里,但是我程序没算出来就不算点赞
那o哥 我断这程序有bug 会自动过滤 jubi这个字段,估计是这样!
O哥 你现在py是3还是2.7啊
3.6 吧
啥也没看懂,吓的我赶紧投了一票,别把我抓到“差集”里面去啊。
差集是啥呢?小黑屋么
差集差集,就是差生的集合 😄
哈哈!真有趣!😆😆
😄 谢谢夸奖
不用謝!!>V<
@kenchung 是數學老師(兼出色programmer)該出場的時候了。
还有老师 😄 吓得我瓜子都掉地上了
數學老師倒是真的,出色programmer就過獎了😂
我只是略懂皮毛吧
我之前也用javascript寫過相同的東西,我用的方法就是你上文所述的那個不太漂亮的做法 XD
這個差集的概念我一時也想不起
可是我好奇到底python背後是怎樣求出差集的呢?會不會也是正在用我們覺得不太漂亮的那個做法?😂
感谢老师的回复
Python 背后的实现有可能是你说的做法,但是可能性有多大就不清楚啦
感兴趣的话,可以弄俩超大集合
然后用两种方法分别运行一下,看看CPU时间之类的
我是懒得弄了,其实我大部分时候的原则都是好用就行
對呀,我平日編程時也懶得思考怎樣才是最快,好用就行了
除非要處理的數據真是超大型的吧,否則都看不出時間差別了
不過待我有空時研究一下也好,這題目也蠻有趣的~
这个有用,只是不会用。另外,给我帖子点贊的下拉菜单里就都能看到了,暂时用不着这功能了。
😄 其实就是举个栗子啦
兴师动众的能就干这点事嘛
You got my vote and a resteem :)
Good information.i am so happy because steemit is the best idea to earn more and more,i hope all of my fds are yo helpful.vote and follow me for supporting me.
好东西!这个可以方便的抓出只评论不点赞的假朋友,和只点赞不评论的好朋友:)
😕
😕
your post looks interesting
i wish there was an english translation
anyway thanks for sharing
It's python programming.
这个可以用来打小报告啦。哈哈
喔!! 我看到這個就頭疼,我完全想不起我學生時代在做什麼了!!
是个好的文章!
SteemIt API Tool - Check If Your Followers Have Voted Your Post 撸了一个工具 - 快速检查你的粉丝到底有没有给你点赞!(带 免费API,不谢)https://steemit.com/steemit/@justyy/steemit-api-tool-check-if-your-followers-have-voted-your-post-api