2012-10-04 48 views
14

最方便的,「Python化」的方式來從列表中刪除重複項基本上是:使用自定義比較刪除重複

mylist = list(set(mylist)) 

但是,假如你的標準計算重複取決於所包含對象的特定成員場在mylist

那麼,一個解決方案是隻爲mylist中的對象定義__eq____hash__,然後經典的list(set(mylist))將工作。

但是有時你需要更多的靈活性。能夠創建即時lambda表達式以使用自定義比較例程以不同方式識別重複對象會非常方便。理想的情況下,是這樣的:

mylist = list(set(mylist, key = lambda x: x.firstname)) 

當然,這並不實際工作,因爲set構造不採取比較功能,並set需要可哈希鍵以及。

那麼最接近實現類似目的的方法是什麼,以便您可以使用任意比較函數刪除重複項?

回答

19

您可以使用,而不是一組,在字典的鍵將是唯一值的字典:

d = {x.firstname: x for x in mylist} 
mylist = list(d.values()) 
+0

這是最簡單的方法。性能應該與您的設置方法幾乎相同。 – Chronial

+2

哇我以前從來沒有見過'{x.firstname:x for m in mylist}'的語法。它叫什麼,我在哪裏可以在文檔中找到它。 –

+2

@MarwanAlsabbagh:這是[dict理解](http://www.python.org/dev/peps/pep-0274/)。它是在Python 2.7和3.0中添加的。這相當於'dict((x.firstname,x)for mylist')''。 – interjay

0

我這樣做:

duplicates = set() 
newlist = [] 
for item in mylist: 
    if item.firstname not in duplicates: 
     newlist.append(item) 
     excludes.add(item.firstname) 
0

如果你需要有更多的靈活性with「in」運算符

def is_in(value, value_list, comparer_function): 
    """ checkes whether "value" already in "value_list" """ 
    for vi in value_list: 
     if comparer_function(vi, value): 
      return True 
    return False 

def make_unique_set(in_list, comparer_function=lambda a, b: a == b): 
    """ retusn unique set of "in_list" """ 
    new_list = [] 
    for i in in_list: 
     if not is_in(i, new_list, comparer_function): 
      new_list.append(i) 
    return new_list 

make_unique_set(mylist, comparer_function=lambda a, b : a.firstname == b.firstname)