【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)的操作。

一、 获取两个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中,但不会同时出现在二者中)

二、获取两个list 的并集

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

三、 获取两个 list 的差集

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

四、两个区间求交集

def merge_intervals(intervals):
    intervals.sort(key=lambda x: x[0])
    merged = []
    for interval in intervals:
        if not merged or merged[-1][1] < interval[0]:
            merged.append(interval)
        else:
            merged[-1][1] = max(merged[-1][1], interval[1])
    return merged

# 测试
intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
merged_intervals = merge_intervals(intervals)
print(merged_intervals)

五、讨论

因为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']

参考资料

这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn