从列表中删除元素保留顺序和一份重复项

时间:2017-06-20 17:03:25

标签: 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的顺序。 (其余的"副本"在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)])

1 个答案:

答案 0 :(得分:1)

首先,当你迭代它时,改变serialized <- as.integer(serialize(data,NULL)) dataset <- data.frame(serialized,stringsAsFactors=FALSE) maml.mapOutputPort("dataset"); :这会抛弃迭代索引并产生不良结果。

以另一种方式看待逻辑,l1

组成
    {li> l3元素未显示在l1
  • l2元素确实出现在l1中,但l2多次出现

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

您可以使用l1方法确定某个项目是否出现多次,如

count

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