【发布时间】:2017-11-23 08:30:54
【问题描述】:
我有两个大列表,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 中出现两次以上怎么办?
-
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]。
-
解决方案做得很好。
标签: python list duplicates