我有两个大的名单,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)])
答案 0 :(得分:1)
首先,当你迭代它时,不改变serialized <- as.integer(serialize(data,NULL))
dataset <- data.frame(serialized,stringsAsFactors=FALSE)
maml.mapOutputPort("dataset");
:这会抛弃迭代索引并产生不良结果。
以另一种方式看待逻辑,l1
由
l3
元素未显示在l1
中
l2
元素确实出现在l1
中,但l2
多次出现您可以通过以下两种方式之一进行攻击:(1)迭代l1
并检查每个元素的这些条件; (2)迭代l1
,识别要删除的元素;然后从l2
构建l3
,删除元素并根据需要减少剩余的重复项。
您可以使用l1
方法确定某个项目是否出现多次,如
count
详细的设计和编码留给学生练习。 : - )