2014-01-29 54 views
1

到現在爲止,我已經在Python已經使用此代碼uniquify(刪除重複項)從名單:Uniquifying列出的名單在python

my_list = list(set(my_list))

我現在有一個列表的列表,我想能夠從列表清單中刪除重複項。例如:

(['possible-duplicate', 'random-data'], ['possible-duplicate', 'random-data'], ['possible-duplicate', 'random-data'])

我想刪除整個子列表,如果possible-duplicate是重複的。

可以這樣做嗎?

感謝

+1

你關心保持這種格式的數據嗎?因爲有一種方法可以將所有列表「扁平化」,以便無論列表列表中列出了多少個列表,它都會返回一個包含「同一級別」所有數據的列表,然後您可以使用該列表函數刪除重複項。雖然 – ZekeDroid

回答

2

做一本字典,從您的數據:

data = (['possible-duplicate', '12345'], 
     ['not-a-duplicate', '54321'], 
     ['possible-duplicate', '51423']) 
data_unique = dict(data) 

結果是{'not-a-duplicate': '54321', 'possible-duplicate': '51423'},或者如果你喜歡一個元組列表,使用date_unique.items(),它給你[('not-a-duplicate', '54321'), ('possible-duplicate', '51423')]

或爲更普遍的情況,其中子列表有兩個以上的元素,你可以使用這個

data_unique = dict((d[0], d) for d in data) 

,然後用data_unique.values()收回「uniquified」名單。

+0

假設每個子列表只有2個項目長... –

+0

是的,假設問題是實際用例的代表。 –

+1

@JoranBeasley增加了一般情況下的替代方案。現在好多了? :-) –

3
seen = set() 

[sublist for sublist in my_list if sublist[0] not in seen and not seen.add(sublist[0])] 

這種情況中保持秩序爲好,這list(set(...))沒有。

+1

我不認爲使用理解副作用的if語句是值得推薦的。它不會增加可讀性和可維護性,但更多的是魔術。雖然這個答案用'and not seen.add()'已經在SO上出現過不同的次數。 – Hyperboreus