Python 从保留顺序和一个副本的列表中删除元素

Python 从保留顺序和一个副本的列表中删除元素,python,list,duplicates,Python,List,Duplicates,我有两个大列表,L1和L2。L2是L1的子集。L1和L2都可以包含重复的术语,但如果需要,我可以相当容易地检测/删除/保存这些术语 我想写一个函数,从L1中删除所有也在L2中的元素。但是,如果L1中的一个元素自身重复(在L1中是重复的),并且在L2中也存在,我希望在结果列表中保留它的一个副本 例如: l1 = [1, 2, 2, 3, 4] l2 = [2, 4] l3 = question_function(l1, l2) L3应为: [1, 2, 3] 我还想保留从L1到L3的顺序。(l

我有两个大列表,L1和L2。L2是L1的子集。L1和L2都可以包含重复的术语,但如果需要,我可以相当容易地检测/删除/保存这些术语

我想写一个函数,从L1中删除所有也在L2中的元素。但是,如果L1中的一个元素自身重复(在L1中是重复的),并且在L2中也存在,我希望在结果列表中保留它的一个副本

例如:

l1 = [1, 2, 2, 3, 4]
l2 = [2, 4]
l3 = question_function(l1, l2)
L3应为:

[1, 2, 3]
我还想保留从L1到L3的顺序。(l1中副本的l3中的剩余“副本”必须位于与l1中副本相似的位置)。我正在处理的列表中的实际元素是字符串,如果这与排序等相关的话

我尝试获取L1中所有重复项的列表,然后从L1中删除L2中的所有元素,然后将所有重复项的列表追加回L1,但这并不能保持顺序。l3最终看起来像:

[1, 3, 2]
如果可能的话,我想避免在每个列表上循环,但这是我唯一能解决这个问题的方法吗?任何关于如何实现这一点的见解都是非常好的

已解决

#Returns a list with all duplicates but one removed
def uniq_get(seq):
    seen = set()
    seen_add = seen.add
    return [x for x in seq if not (x in seen or seen_add(x))]
#The full function
def answer(l1, l2):
    return uniq_get([x for x in l1 if (x not in l2) or (x in l2 and l1.count(x) > 1)])
首先,不要在迭代过程中更改
l1
:这会使迭代索引失效,并产生不希望的结果

从另一个角度看逻辑,
l3

  • l1
    元素未出现在
    l2
  • l1
    元素确实出现在
    l2
    中,但多次出现在
    l1
您可以通过以下两种方式之一来攻击它:(1)迭代
l1
,并检查每个元素的这些条件;(2) 迭代
l2
,确定要删除的元素;然后从
l1
构建
l3
,根据需要删除元素并减少剩余重复项

您可以使用
count
方法来确定项目是否多次出现,如中所示

if l1.count(item) > 1:
    l3.append(item)

详细设计和编码留作学生练习。:-)

如果一个元素在L1中出现两次以上该怎么办?这与
L1
=[1,2,3,4,2]有什么关系?如果L1中的元素出现两次以上,它应该删除除一个元素以外的所有元素,这应该是它的第一个实例。因此,对于l1=[1,2,3,4,2],l2=[2,4],l3应该是[1,2,3],如果l1是[1,2,2,3,4,2],l3也应该是[1,2,3]。解决方案做得不错。将尝试基于要点逻辑的列表理解。那真的很有帮助!