我有兩個大的列表,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中的副本中的剩餘「副本」必須與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]應該怎麼做? – Prune
如果l1中的元素存在兩次以上,它應該除去其中的一個元素,這應該是它的第一個實例。因此,對於l1 = [1,2,3,4,2],l2 = [2,4],l3應該是[1,2,3] 如果l1是[1,2,3,2,3,4] ,2],l3也應該是[1,2,3]。 – Menixm