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