2017-09-22 399 views
1

我想刪除重複在python列表中的方式,允許我以相同的方式更改另一個相應的列表。在下面的例子中,original是我想要去重複的列表。在key共享相同的索引原始每個元素對應於對方:Python刪除列表中的重複項

original = [a,a,a,3,4,5,b,2,b] 
key  = [h,f,g,5,e,6,u,z,t] 

所以我想刪除重複在original使得無論元件I從原始刪除我刪除對應的元件(相同的索引的)在key。結果我想:

deduplicated_original = [a,3,4,5,b,2] 
deduplicated_key  = [h,5,e,6,u,z] 

我能得到deduplicated _original使用list(set(original))但我不能得到相應的deduplicated_key

+0

是'['g',5,'e',6,'t','z'] 「好嗎?除去最後的所有東西? –

+0

你能不能顯示你所做的任何嘗試?你究竟在哪裏卡住? –

回答

6

可以使用set保持重複的跟蹤和enumerate()比原先的索引/值迭代清單:

seen = set() 
lst = [] 

for i, v in enumerate(original): 
    if not v in seen: 
     lst.append(key[i]) 
     seen.add(v) 
print(lst) 
0

您可以手動得到這樣重複的所有索引:

indices = [] 
existing = set() 
for i, item in enumerate(original): 
    if item in existing: 
     indices.append(i) 
    else: 
     existing.add(item) 

,然後從key列表中刪除那些索引,反向因爲刪除鍵改變的進一步項指標:

for i in reversed(indices): 
    del key[i] 
1

也許更少優雅,不容易跟隨列表revesal,指數切片

內部列表排版行走輸入列表org向後,詢問是否有一個事先匹配元件,如果是這樣的記錄本的索引重複

[len(org) - 1 - i 
for i, e in enumerate(org[::-1]) if e in org[:-i-1]] 

然後外列表排版使用.pop()修改組織,KY作爲副作用

嵌套列表理解 '的DUP',A '一個襯裏'(換行):

org = ['a','a','a',3,4,5,'b',2,'b'] 
ky = ['h','f','g',5,'e',6,'u','z','t'] 

dups = [(org.pop(di), ky.pop(di)) 
     for di in [len(org) - 1 - i 
        for i, e in enumerate(org[::-1]) if e in org[:-i-1]]] 

org, ky, dups 
Out[208]: 
(['a', 3, 4, 5, 'b', 2], 
['h', 5, 'e', 6, 'u', 'z'], 
[('b', 't'), ('a', 'g'), ('a', 'f')]) 

當然,你實際上並不需要將列表匹配結果分配給任何東西,以獲得修改列表的副作用