譬如有个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找出上面的资讯
要如何操作呢
如果list下面的每个sub list内的元素都是不重复的话,遍历每个sub list然后把每个元素当作key放进另一个dictionary,value就从1开始count,每次遇到就让他+1,如果每个sub list的element会重复出现就先取set,以上最基本办法
先把list of list转list of set后就用set取交集
喔我看懂你的题目了,我那个方法应该不是你要的解,我想想看…
作者:
Hsins (翔)
2022-11-09 14:25:00我是看不出来要取交集,还是要找元素在集合中出现的次数啦…你这样的话还有 [a]*2 啊然后会不会有 [a, a, b] 这种? 如果还有 [a, a, c] 的话要算次数的话 [a] 要算几次? [a, a] 要不要算是一种?
我只想到暴力解,会用到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:00set可以处理交集的问题
喔…小地方,跑combinations的时候不用跑到len(arr),跑到sub list最长那个长度就好
作者: HerbCat (草猫) 2022-11-15 00:13:00
作者:
n3rd (全日本空输ANA)
2022-11-17 18:10:00set()还蛮容易理解的 而且程式码会蛮干净的