【2.1.3】列表求交集、并集、差集--set

python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算。sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作。

1. 获取两个list 的交集

#方法一:

 a=[2,3,4,5]
 b=[2,5,8]
 c=["abc","cde","haha","lala"]
 d=["abc","dddd","eee","lal"]
 tmp = [val for val in a if val in b]
 print tmp
 #[2, 5]

#方法二

 print list(set(a).intersection(set(b)))

方法三:

    >>> x = set('spam') 
    >>> y = set(['h','a','m']) 
    >>> x, y 
    (set(['a', 'p', 's', 'm']), set(['a', 'h', 'm'])) 

>>> x & y # 交集 
set(['a', 'm']) 
>>> x | y # 并集 
set(['a', 'p', 's', 'h', 'm']) 
>>> x - y # 差集 
set(['p', 's']) 
>>> d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)

2. 获取两个list 的并集

print list(set(a).union(set(b)))

3. 获取两个 list 的差集

print list(set(b).difference(set(a))) # b中有而a中没有的

讨论:

因为set以后,list变得无序了,但是仍旧想保留list之前的顺序

in Python 3.6, set() now should keep the order, but there is another solution for Python 2 and 3: 

>>> x = [1, 2, 20, 6, 210]
>>> sorted(set(x), key=x.index)
[1, 2, 20, 6, 210]

>>> a =[1, 2, 'a']
>>> b=[2]
>>> sorted((set(a)-set(b)),key=a.index)
[1, 'a']

参考资料:

http://blog.chinaunix.net/uid-200142-id-3992553.html

http://blog.csdn.net/business122/article/details/7541486

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学