[问题] 多个list项目取交集

楼主: FantasyChopi (Fantasy_Chopin)   2022-11-08 23:49:55
譬如有个list的资料是:
list=[[a,b,c,d],[b,c],[a,c,e],[b,c,f]]
则各项目的交集有
[c](*4)
[b](*3)
[b,c](*3)
[a,c](*2)
想请教板上的大大
若是想用python找出上面的资讯
要如何操作呢
作者: tzouandy2818 (Naked Bear)   2022-11-09 00:49:00
用set()吧
作者: venomsoul (不怕太太)   2022-11-09 09:21:00
如果list下面的每个sub list内的元素都是不重复的话,遍历每个sub list然后把每个元素当作key放进另一个dictionary,value就从1开始count,每次遇到就让他+1,如果每个sub list的element会重复出现就先取set,以上最基本办法
作者: lycantrope (阿宽)   2022-11-09 09:52:00
先把list of list转list of set后就用set取交集
作者: kikicheng (ohhiyo123)   2022-11-09 10:57:00
直觉是用Apriori 但不知道是否会杀鸡焉用牛刀~https://reurl.cc/x1Ezye取length就可以达到你要的结果
作者: venomsoul (不怕太太)   2022-11-09 12:38:00
喔我看懂你的题目了,我那个方法应该不是你要的解,我想想看…
作者: Hsins (翔)   2022-11-09 14:25:00
我是看不出来要取交集,还是要找元素在集合中出现的次数啦…你这样的话还有 [a]*2 啊然后会不会有 [a, a, b] 这种? 如果还有 [a, a, c] 的话要算次数的话 [a] 要算几次? [a, a] 要不要算是一种?
作者: venomsoul (不怕太太)   2022-11-09 14:36:00
我只想到暴力解,会用到itertools.combinations首先,把原始list里面所有的element都单独取出,建立arr = [a, b, c, d, e, f]然后,用combinations跑出从1个元素到len(arr)个元素的组合,假设放在arr1然后,创立一个函数,比对a, b两个iterable物件中,a的元素是否都在中,如果都有就回传Truea的元素是否都在b中*然后,把arr1中的每个组合跟原始list中的每个sub list跑a, b的比对函数,如果为True,检查字典d是否有这个tuple做为key的纪录,没有的话就加入字典,value给1有的话,value就+1,这样最后字典里面就是每种combination在所有list的sub list中出现的次数,然后从字典中取出只有value > 1的key,同时跟他的value挂在一起输出就可以了我只想到暴力解就是了Orz喔对,这是默认在每个原始list中的sub list下面的元素都不重复出现的方法然后上面Hsins大提到应该还会有[a]*2才对才符合我想的题目如果是一个sub list中会出现两次以上的相同元素而且要视为独立的两个元素的话,一开始extract元素的时候就要刻意多加入一个该元素去跑combinations
作者: kakar0to (Poker Face)   2022-11-09 15:02:00
set可以处理交集的问题
作者: venomsoul (不怕太太)   2022-11-09 15:12:00
喔…小地方,跑combinations的时候不用跑到len(arr),跑到sub list最长那个长度就好
作者: HerbCat (草猫)   2022-11-15 00:13:00
作者: n3rd (全日本空输ANA)   2022-11-17 18:10:00
set()还蛮容易理解的 而且程式码会蛮干净的

Links booklink

Contact Us: admin [ a t ] ucptt.com