ISEE小语
“成年世界交往的潜规则,就是不给别人添麻烦,彼此独立又适当依靠。”
——网友
在日常工作中,时常会对列表数据进行差异化处理,那么对比两个列表的差异有哪些方式呢?
本次分享将采用的8种方式进行汇总,具体方法取决于您的需求,比如是否需要考虑元素的重复和顺序等。
1. 使用集合
可以将列表转换为集合进行比较。
注:这种方式忽略元素的顺序和重复,意思就是说 即便您的数据源列表中有重复项,最终输出的结果 会打破原有顺序,并去掉重复项——无序、去重
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 找到差异
diff_1 = set(list_1) - set(list_2)
diff_2 = set(list_2) - set(list_1)
print("List_1 中存在,但不在 List_2 中:", diff_1)
print("List_2 中存在,但不在 List_1 中:", diff_2)
结果:
将共同的元素输出
即,将两个列表取交集,将共有的元素整合到一起
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 将共同的元素输出
common_elements = set(list_1) & set(list_2)
print("其中共同的元素:", common_elements)
结果:
2. 使用列表推导式
可以使用列表推导式进行比较。
注:这种方式会考虑列表的顺序和重复数据,意思就是说 即便您的数据源列表中有重复项,最终输出的结果 会按原有顺序,并保留重复项——顺序、不去重
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 找到差异
diff_1 = [item for item in list_1 if item not in list_2]
diff_2 = [item for item in list_2 if item not in list_1]
print("List_1 中存在,但不在 List_2 中:", diff_1)
print("List_2 中存在,但不在 List_1 中:", diff_2)
结果:
将共同的元素输出
即,以list_1为准,将list_2中存在的元素输出
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 将共同的元素输出
common_elements = [item for item in list_1 if item in list_2]
print("其中共同的元素:", common_elements)
结果:
3. 使用Counter
可以使用 Counter 函数来比较两个列表。
注:这种方式会考虑列表的顺序和重复数据,意思就是说如果数据源列表中有重复的数据,最终输出的结果 会保留重复项,按原顺序并计数——顺序、不去重
from collections import Counter
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
counter1 = Counter(list_1)
counter2 = Counter(list_2)
# 找到差异# 在 list_1 中多出的元素
diff_1 = counter1 - counter2
# 在 list_2 中多出的元素
diff_2 = counter2 - counter1
print("List_1 中存在,但不在 List_2 中:", diff_1)
print("List_2 中存在,但不在 List_1 中:", diff_2)
结果:
将共同的元素输出
即,使用计数器的交集获取共同元素,同时考虑重复,顺序是按计数自动降序排序
from collections import Counter
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 将共同的元素输出
common_elements = counter1 & counter2
print("其中共同的元素:", common_elements)
结果:
4. 使用 numpy
可以使用 numpy 来进行对两个列表的对比操作。尤其是如果你正在处理数值型数据并且对性能有要求,它提供了高效的数组操作。
注:这种方式忽略元素的顺序和重复,意思就是说 即便您的数据源列表中有重复项,最终输出的结果 会打破原有顺序,并去掉重复项——无序、去重
import numpy as np
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 找到差异
# 在 list_1 中多出的元素
diff_1 = np.setdiff1d(list_1, list_2)
# 在 list_2 中多出的元素
diff_2 = np.setdiff1d(list_2, list_1)
print("List_1 中存在,但不在 List_2 中:", diff_1)
print("List_2 中存在,但不在 List_1 中:", diff_2)
结果:
将共同的元素输出
即,输出两个列表中共同的元素
import numpy as np
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 将共同的元素输出
common_elements = np.intersect1d(list_1, list_2)
print("其中共同的元素:", common_elements)
结果:
5. 使用 pandas
可以使用 pandas 库来进行对两个列表的对比操作。尤其是正在处理数据分析,它提供了强大的数据结构和操作功能。
注:这种方式会考虑列表的顺序和重复数据,意思就是说 即便您的数据源列表中有重复项,最终输出的结果 会保留重复项,按原有顺序 带索引序号——顺序、不去重
import pandas as pd
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 转换为 pandas Series
s1 = pd.Series(list_1)
s2 = pd.Series(list_2)
# 找到差异
# 在 list_1 中多出的元素
diff_1 = s1[~s1.isin(s2)]
# 在 list_2 中多出的元素
diff_2 = s2[~s2.isin(s1)]
print("List_1 中存在,但不在 List_2 中:", diff_1)
print("List_2 中存在,但不在 List_1 中:", diff_2)
结果:
将共同的元素输出
即,通过系列的 isin 方法找到两个列表中共同的元素
import pandas as pd
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 将共同的元素输出
# 转换为 pandas Series
s1 = pd.Series(list_1)
s2 = pd.Series(list_2)
# 找到共同元素
common_elements = s1[s1.isin(s2)]
print("其中共同的元素:", common_elements)
结果:
6. 使用 filter 函数
可以使用内置的 filter 函数结合 lambda 表达式来对比两个列表的差异。
注:这种方式会考虑列表的顺序和重复数据,意思就是说 即便您的数据源列表中有重复项,最终输出的结果 会有保留重复项,并会按原有顺序输出——顺序、不去重
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 找到差异
# 在 list_1 中多出的元素
diff_1 = list(filter(lambda x: x not in list_2, list_1))
# 在 list_2 中多出的元素
diff_2 = list(filter(lambda x: x not in list_1, list_2))
print("List_1 中存在,但不在 List_2 中:", diff_1)
print("List_2 中存在,但不在 List_1 中:", diff_2)
结果:
将共同的元素输出
即,使用过滤器函数来提取两个列表中共同的元素
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 将共同的元素输出
common_elements = list(filter(lambda x: x in list_2, list_1))
print("其中共同的元素:", common_elements)
结果:
7. 使用itertools库
虽然这不是一个常见的用法,但如果你的列表已经排序,可以使用 itertools.groupby 来分组并比较两个列表的差异。
注:这种方式会考虑列表的顺序和重复数据,意思就是说 即便您的数据源列表中有重复项,最终输出的结果 会有保留重复项,并会按原有顺序输出——顺序、不去重
from itertools import groupby
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 找到差异
# 在 list_1 中多出的元素
diff_1 = [key for key, group in groupby(list_1) if key not in list_2]
# 在 list_2 中多出的元素
diff_2 = [key for key, group in groupby(list_2) if key not in list_1]
print("List_1 中存在,但不在 List_2 中:", diff_1)
print("List_2 中存在,但不在 List_1 中:", diff_2)
结果:
将共同的元素输出
即,可使用分组提取两个列表中共同的元素
from itertools import groupby
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 将共同的元素输出
common_elements = [key for key, group in groupby(list_1) if key in list_2]
print("其中共同的元素:", common_elements)
结果:
8. 使用 difference 方法
这种方法是针对列表的集合操作,比较两个列表的差异。
注:这种方式忽略元素的顺序和重复,意思就是说 即便您的数据源列表中有重复项,最终输出的结果 会打破原有顺序,并去掉重复项——无序、去重
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 找到差异
# 在 list_1 中多出的元素
diff_1 = list(set(list_1).difference(list_2))
# 在 list_2 中多出的元素
diff_2 = list(set(list_2).difference(list_1))
print("List_1 中存在,但不在 List_2 中:", diff_1)
print("List_2 中存在,但不在 List_1 中:", diff_2)
结果:
将共同的元素输出
即,使用集合的 intersection 方法提取两个列表中共同的元素
list_1 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Chis']
list_2 = ['John', 'Lily', 'Carry', 'Blue', 'Carry', 'Tom', 'Nic', 'Lucy', 'Mike', 'Hedy']
# 将共同的元素输出
common_elements = list(set(list_1).intersection(list_2))
print("其中共同的元素:", common_elements)
结果:
总结
1. 使用集合的方式,最终输出的是个集合{},使用的时候如果需求是要一个列表,就需要再通过list({})转一下。
2. 使用列表推导式,最终输出的也是个列表,与原数据类型一样。
3. 使用 collections.Counter,最终输出是一个Counter类型,使用的时候可以转换为字典,如:dict(Counter)。
4. 使用 numpy方式,最终输出的也是个列表,与原数据类型一样,如果处理数值型数据性能会很高效。
5. 使用 pandas方式,最终输出的是pandas Series格式,在使用的时候可以tolist(),输出一个列表。
6. 使用 filter 函数方式,与列表推导式相似,最终输出的也是个列表,与原数据类型一样。
7. 使用 itertools 库的 groupby,与列表推导式、使用 filter 函数相似,最终输出的也是个列表,与原数据类型一样。
8. 使用集合的 difference 和 intersection 方法,最终输出一个列表。
文章就分享到这儿,喜欢就点个赞吧!