2016-12-27 124 views
0

我有兩個數組,一個存儲名稱,另一個存儲與該名稱關聯的URL。但是,該列表可能包含重複的名稱和URL。傳統上刪除重複我會將兩個數組轉換成一個集合。但是,如果URL相同,我只希望從兩個數組中刪除元素。在Python中刪除兩個鏈接數組中的重複項

例如,如果這些是最初的數組:

name = ['Bob', 'Mary', 'John', 'John', 'Bob'] 
url = ['url1', 'url2', 'url3', 'url4', 'url1'] 

我想這樣的輸出:

name = ['Bob', 'Mary', 'John', 'John'] 
url = ['url1', 'url2', 'url3', 'url4'] 

回答

-1

你可以做到這一點,name, url = map(list,zip(*list(set(zip(name, url)))))這樣做是它拉鍊nameurl。使用set刪除重複項,使其重新回到列表中。解壓縮列表,然後映射列表以將元組變回列表。

注意:這不會保留順序,但元素仍將對齊(因爲在'John'仍將映射到'url3')。

0

拉鍊名單一起,基本上是創建一對,然後用一組以消除重複

>>> name = ['Bob', 'Mary', 'John', 'John', 'Bob'] 
>>> url = ['url1', 'url2', 'url3', 'url4', 'url1'] 
>>> list(zip(name, url)) 
[('Bob', 'url1'), ('Mary', 'url2'), ('John', 'url3'), ('John', 'url4'), ('Bob', 'url1')] 
>>> x = set(list(zip(name, url))) 
>>> x 
{('Mary', 'url2'), ('Bob', 'url1'), ('John', 'url4'), ('John', 'url3')} 

爲了讓項目早在單獨列表,使用列表理解(唯一的缺點是你」由於初始設定的轉換,會丟失物品的順序)

>>> a, b = [item[0] for item in x], [item[1] for item in x] 
>>> a, b 
(['Mary', 'Bob', 'John', 'John'], ['url2', 'url1', 'url4', 'url3']) 
>>> 
1
In [83]: name = ['Bob', 'Mary', 'John', 'John', 'Bob'] 

In [84]: url = ['url1', 'url2', 'url3', 'url4', 'url1'] 

In [85]: urls = set() 

In [86]: answer = [] 

In [87]: for n,u in zip(name, url): 
    ....:  if u in urls: continue 
    ....:  answer.append((n,u)) 
    ....:  urls.add(u) 
    ....:  

In [88]: answer 
Out[88]: [('Bob', 'url1'), ('Mary', 'url2'), ('John', 'url3'), ('John', 'url4')] 

In [89]: name, url = zip(*answer) 

In [90]: name 
Out[90]: ('Bob', 'Mary', 'John', 'John') 

In [91]: url 
Out[91]: ('url1', 'url2', 'url3', 'url4')