获得python列表A和B之间差异的意外结果

时间:2017-06-30 21:13:05

标签: python list set diff difference

我有两个字符串名称列表:

>>> len(list_a)
14740
>>> len(list_b)
14277

我需要在list_a中获取不在list_b中的463个名称。 基于其他文章和答案,我尝试过:

a_set = set(list_a)
b_set = set(list_b)

diff1 = a_set - b_set
>>> len(diff1)
1457

diff2 = b_set - a_set
>>> len(diff2)
994

有趣的是1457 - 994 = 463.所以我觉得我很亲密,但却缺少或误解了某些东西。 我错过了什么?

Python 3

感谢。

1 个答案:

答案 0 :(得分:1)

list_b不一定是完全包含在list_a中的数据的子集。考虑两个具有相似构图的小得多的列表。

list_a = [1, 2, 4, 4, 6]
list_b = [1, 3, 4]

如您所见,list_b包含的3不在list_a中,但list_a的长度仍然更长。

简单循环

如果您尝试在list_a中获取list_b中的值,则以下是Python中非常直接的翻译。让我们将list_b转换为集合,这样我们就可以获得元素包含的恒定时间查找。

list_a = [1, 2, 4, 4, 6]
list_b = [1, 3, 4]
set_b = set(list_b)
list_result = []
for a_ele in list_a:
    if a_ele not in set_b:
        list_result.append(a_ele)

print(list_result)
# [2, 6]

注意:如果您不希望结果列表中出现重复值,则只需在中迭代set(list_a)而不是list_a 循环。

设置逻辑

你认为使用设定逻辑来回答这个问题是正确的,这可以基本上按照你所写的方式完成。

set_a = set(list_a)
set_b = set(list_b)

list_result = list(set_a - set_b)
print(list_result)
# [2, 6]

这将创建一个列表,其中list_a中的所有元素都已移除list_b 中的元素