文章目录
摘要
本文主要介绍在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]