我有两个字符串名称列表:
>>> 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
感谢。
答案 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
中的元素。