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

in #cn7 years ago

集合的运算

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

参考链接

Sort:  

这个有用,只是不会用。另外,给我帖子点贊的下拉菜单里就都能看到了,暂时用不着这功能了。

😄 其实就是举个栗子啦
兴师动众的能就干这点事嘛

哈哈,這個也太好玩吧。誰沒有給我點贊站出來。 XD.
想到了一個點子做CN 區的小遊戲XD。

邏輯是有看有懂,代碼是明白但不懂寫,看來要惡補 python 了....汗

努力學習...

o哥很有心啊,教大家之前還專門翻書複習
Python真的很好用,基本的代碼不難,但要寫出有效率的代碼還真是一門藝術 (我還在努力學這部份 哈哈)
謝謝指教了

😄 谢谢夸奖
其实我写代码很滥的
所以要努力学习

一起努力 ~

抱歉,抱歉,一時疏忽,趕緊把網址放上來,馬上補點!Sorry!!

哼哼,我很记仇的 💢
补点?晚了!

難道?難道,寄給你100 SBD,你就有可能原諒我麼?我想是不可能的,我還是打消這個荒謬的念頭好了....

😄那肯定是可以原谅的啦
其实也不用那么多啦,98SBD 就好啦

我不相信!要是真的能原諒,1000 sbd都不是問題!但我已絕望....

😭 真的只有98, 哦, 88 SBD, 就可以原谅的啦

不可能!這麼大的傷害,再多錢都彌補不了!

代码是看懂了,就是不知道这个list_user怎么得到 哈哈,我用上了我所有了编程知识了。:)
PS 我可是点赞了哟

哼哼,点没点赞以后以我代码算出来的为准 😄
即便我看到你在下拉列表里,但是我程序没算出来就不算点赞

那o哥 我断这程序有bug 会自动过滤 jubi这个字段,估计是这样!

O哥 你现在py是3还是2.7啊

啥也没看懂,吓的我赶紧投了一票,别把我抓到“差集”里面去啊。

差集是啥呢?小黑屋么

差集差集,就是差生的集合 😄

哈哈!真有趣!😆😆

😄 谢谢夸奖

不用謝!!>V<

@kenchung 是數學老師(兼出色programmer)該出場的時候了。

还有老师 😄 吓得我瓜子都掉地上了

數學老師倒是真的,出色programmer就過獎了😂
我只是略懂皮毛吧
我之前也用javascript寫過相同的東西,我用的方法就是你上文所述的那個不太漂亮的做法 XD
這個差集的概念我一時也想不起
可是我好奇到底python背後是怎樣求出差集的呢?會不會也是正在用我們覺得不太漂亮的那個做法?😂

感谢老师的回复

Python 背后的实现有可能是你说的做法,但是可能性有多大就不清楚啦

感兴趣的话,可以弄俩超大集合
然后用两种方法分别运行一下,看看CPU时间之类的

我是懒得弄了,其实我大部分时候的原则都是好用就行

對呀,我平日編程時也懶得思考怎樣才是最快,好用就行了
除非要處理的數據真是超大型的吧,否則都看不出時間差別了

不過待我有空時研究一下也好,這題目也蠻有趣的~

建议来个安装Python的教程还有如何把STEEM,PISTON等等安装进电脑。因为我遇到的情况是一个问题解决了又来一个问题。

Windows 8.1 64Bit

安装教程一堆啊 😄
百度一下你就知道

Coin Marketplace

STEEM 0.20
TRX 0.13
JST 0.030
BTC 67685.37
ETH 3498.92
USDT 1.00
SBD 2.71