2017-06-20 129 views
0

我有兩個大的列表,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)]) 
+0

如果一個元素在L1中出現兩次以上,該怎麼辦? –

+0

'l1' = [1,2,3,4,2]應該怎麼做? – Prune

+0

如果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

回答

1

首先,做改變l1你遍歷它:將甩開你的迭代索引和產生不良結果。

望着邏輯的另一種方式,l3

  • l1元素不會出現在那些出現在l2l2
  • l1元素,但在l1不止一次

您可以通過以下兩種方法攻擊這一方法:(1)遍歷l1並檢查這些cond每個元素的概念; (2)遍歷l2,識別要移除的元素;然後從l1構建l3,刪除元素並根據需要減少剩餘的重複項。

可以使用count方法來確定項目是否出現不止一次,如

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

詳細設計和編碼作爲一個練習的學生。 :-)

+0

將嘗試基於項目符號邏輯的列表理解。這真的有幫助! – Menixm