Python求多个list的交集、并集、差(补)集的方法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Sniper_LA/article/details/86483425

摘要

本文主要介绍在Python下求多个list的交集、并集、差(补)集的方法。

1.求多个list的交集

输入:

"""以a、b、c为实验对象,求a、b、c都同时拥有的元素"""
a = [0,1,2,3,4]
b = [0,2,6]
c = [-1,2,5,8]
r = list(set(a).intersection(b,c)) # 求多个list的交集:a、b、c同时拥有的元素
print('r -->', r)   # 输出r --> [2]

输出:

r --> [2]

2.求多个list的并集

输入:

"""以a、b、c为实验对象,求a、b、c的并集"""
a = [0,1,2,3,4]
b = [0,2,6]
c = [-1,2,5,8]
r = list(set(a).union(b,c)) # 求多个list的并集
print('r -->', r)   # 输出:r --> [0, 1, 2, 3, 4, 5, 6, 8, -1]"""

输出:

r --> [0, 1, 2, 3, 4, 5, 6, 8, -1]

3.求多个list的差(补)集 - 即获取特定1个list中有,其他list都没有的元素

输入:

"""以a、b、c为实验对象,求 a 中有,但 b 和 c 都没有的元素的并集"""
a = [0,1,2,3,4]
b = [0,2,6]
c = [-1,2,5,8]
r = list(set(a).difference(b,c)) # 求特定1个list(a)中有,其他list(b、c)都没有的元素"""
print('r -->', r)   # 输出:r --> [1, 3, 4]"""

输出:

r --> [1, 3, 4]

4.求在多个list中只出现过1次的元素组成的集合

输入:

"""以a、b、c为实验对象,求在多个list中只出现过1次的元素组成的集合"""
a = [0,1,2,3,4]
b = [0,2,6]
c = [-1,2,5,8]

"""方法1:多次使用 symmetric_difference 方法 - 不推荐使用,因为若涉及更多list,运算较复杂""" 
#即求a、b、c中元素只出现过1次的集合,结果应该为 [-1,1,2,3,4,5,6,8]
#注意:symmetric_difference的参数只能有1个,因此可以多次使用该方法,得到结果
u_abc = list(set(a).union(b,c))  # 求a、b、c的并集
d_ab = list(set(a).intersection(b)) # 求a、b的交集
d_bc = list(set(b).intersection(c)) # 求b、c的交集
d_ac = list(set(a).intersection(c)) # 求a、c的交集
r1 = list(set(u_abc).difference(d_ab,d_bc,d_ac))  # 求b中有而a中没有的元素
print('r1 -->', r1)   # 输出:r1 --> [1, 3, 4, 5, 6, 8, -1]

"""方法2:使用pandas的value_counts,获取只出现过1次的元素,即获取 values_counts == 1 的元素即可"""
import pandas as pd
import numpy as np
df_np = np.array((a+b+c)) # 将3个list合并在一起,形成数组
df_count = pd.Series(df_np).value_counts() # 获取每个元素出现的次数
r2 = list(df_count[df_count == 1].index)  # 获取在3个list中只出现过1次的元素
r2.sort(reverse=False) # 对r2进行排序,方便观察结果
print('r2 -->', r2)  # 输出:r2 --> [-1, 1, 3, 4, 5, 6, 8]

输出:

r1 --> [1, 3, 4, 5, 6, 8, -1]
r2 --> [-1, 1, 3, 4, 5, 6, 8]
展开阅读全文

没有更多推荐了,返回首页