2017-05-10 135 views
-3

的一個部分,我有像這樣在名單列表的Python刪除重複基於子表

[ 
    [12,15], 
    [13,16], 
    [14,17], 
    [14,18], 
    [14,18], 
    [15,19], 
    [16,19], 
    [17,19], 
    [18,20], 
] 

如何從只基於子表的第2列列表中刪除重複Python的list。因此,我得到以下內容:

[ 
    [12,15], 
    [13,16], 
    [14,17], 
    [14,18], 

    [15,19], 


    [18,20], 
] 

如果我想保留最後一個檢測到第一個?像這樣:

[ 
    [12,15], 
    [13,16], 
    [14,17], 

    [14,18], 


    [17,19], 
    [18,20], 
] 

因此,刪除基於子列表的重複項。並選擇保持第一或最後。

編輯:

我忘了說我還需要不斷地爲原始列表(減去一式兩份)。排序很重要,列表並不總是按計數順序排列(12,13,14等,它將是隨機數字)。

+4

vhere是你嘗試 –

回答

1

您可以使用OrderedDict爲此。按排序後的值將項目插入字典中。連續插入將覆蓋以前的值。因此,插入順序選擇是使用找到的第一個還是最後一個重複值。 OrderedDict會記住項目插入的順序。

from collections import OrderedDict 

l = [[12, 15], [13, 16], [14, 17], [14, 18], [14, 18], 
    [15, 19], [16, 19], [17, 19], [18, 20]] 

use_first_value = OrderedDict((i[1], i) for i in reversed(l)) 
filtered_list = list(reversed(use_first_value.values())) 
print(filtered_list) 

use_last_value = OrderedDict((i[1], i) for i in l) 
filtered_list = list(use_last_value.values()) 
print(filtered_list) 

更新:將上面的代碼重構爲支持方向和鍵功能的常用方法。我不確定Python如何將默認的鍵函數參數用於sorted()等函數,所以我使用了一個返回傳遞的項的lambda。

import operator 

def remove_duplicates(items, key=lambda x: x, keep_older=False): 
    # iter acts like an identity function here, i.e. no 
    # change to the order and Python would have called it 
    # anyway. 
    sort_fn = iter if keep_older else reversed 
    values = OrderedDict((key(i), i) for i in sort_fn(items)).values() 
    return list(sort_fn(values)) 

# Use a key function to make it more generic 
key_fn = operator.itemgetter(1) 

# prefer earlier items 
remove_duplicates(l, key=key_fn) 

# prefer later items 
remove_duplicates(l, key=key_fn, keep_older=True) 
+0

這是完美的,現在我已經瞭解了OrderedDict。非常感謝。即使第二個元素中的重複項不總是彼此相鄰,它似乎也可以工作。 – Nertskull

1

使用一組跟蹤重複的,而複製的元素到一個新的列表:

seen = set([]) 
new_list = [] 
for item in l: 
    if item[1] not in seen: 
     new_list.append(item) 
     seen.add(item[1]) 

保留最近,剛剛遍歷列表反向

for item in reversed(l): 
+0

對不起,我沒有在最初的問題(現在更新)這個不清楚,但將在維持秩序?我認爲set()會失去順序。我需要保持列表的排序(減去重複)。 – Nertskull

+0

是保證從一開始就按順序排列的第二個元素,即所有副本都是彼此相鄰的? – Harvey

+0

@Nertskull元素將按順序保存。該組僅用於保存先前看到的值。 在「keep last」示例中,順序將顛倒過來,但可以在for循環之後通過反轉來修復:'new_list = reversed(new_list)' – jmhummel