【问题标题】:Removing elements from a list preserving order and one copy of duplicates从保留顺序的列表中删除元素和一份重复项
【发布时间】: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


【解决方案1】:

首先,不要在您迭代 l1 时对其进行更改:这会破坏您的迭代索引并产生不良结果。

换个角度看逻辑,l3是由

  • l1 没有出现在l2 中的元素
  • l1 元素确实出现在 l2 中,但不止一次出现在 l1

您可以通过以下两种方式之一进行攻击:(1) 遍历l1 并检查每个元素的这些条件; (2) 遍历l2,识别要移除的元素;然后从l1 构建l3,根据需要删除元素并减少剩余的重复项。

你可以使用count方法来判断一个item是否出现了多次,如

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

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

【讨论】:

  • 将尝试基于项目符号逻辑的列表理解。这真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2019-02-13
  • 2013-01-17
  • 1970-01-01
  • 2016-12-28
  • 2010-10-03
相关资源
最近更新 更多