很多posts或How to find list intersection?的目标是在两个列表之间找到unique
个项目:
以下是我的两个清单:
list1=[1, 2, 2, 3, 3, 4, 4, 5, 10, 12]
list2=[1, 1, 2, 2, 3, 4, 4, 5, 8, 18]
我的答案是找到共同的项目,可以重复的项目。例如,一个1
出现在这两个列表中,因此,res
应该包含一个1
。两个2
出现在两个列表中,res
应该包含两个2
,以此类推。
res = [1 ,2, 2, 3, 4, 4, 5]
顺序无关紧要,我的尝试是用途:
res = [x for x in list2 if x in list1]
# res = [1, 1, 2, 2, 3, 4, 4, 5] by above code
但是,这是不正确的,那么我该怎么做呢?
3条答案
按热度按时间tzcvj98z1#
我能想到的唯一方法是从
list2
中删除项目:我很好奇是否有更好的答案。
ctzwtxfj2#
传统的方法不起作用,因为在第二个
for
循环中,它再次迭代整个列表,并再次找到相同的元素,即使它在前面被考虑过。你需要一种机制来消除已经考虑过的元素。
例如:当你在
list2
上迭代list1
,遇到3
。在第一次迭代中,您将在list2
中找到它。但是,当您继续前进并考虑下一个元素3
时,您将再次发现它是list2
中的公共元素,因为您从一开始就迭代list2
。解决方案:
一旦我们在
list2
中遇到重复的元素,我们就从list2
中删除它。另一种使用函数式编程的方法是将
list2
转换为使用map()
的数据结构,以便它为列表中的每个元素保存两个值:[(1, True),(2, True), ...]
迭代时,仅访问设置为
True
的元素而且,每当我们找到一个公共元素时,我们将该元素的
True
设置为False
ruarlubt3#
基于计数器的替代解决方案: