2011-09-04 74 views
2

我正在尋找一個類似於nubBy in Haskell的Python函數,該函數刪除了重複項,但使用了不同的相等性測試。使用Python中的不同平等測試刪除重複項

該函數將採用相等性測試和列表作爲參數,並將返回沒有重複的元素列表。

In [1]: remove(lambda x, y: x+y == 12, [2, 3, 6, 9, 10]) 
Out[1]: [2,3,6] 

例如,這裏(圖2和10)和(9和3)是重複的。我不在乎輸出是[10, 9, 6]還是[2, 3, 6]

Python中是否有等效的內置函數?如果不是,那麼有效實施它的最好方法是什麼?

回答

2

沒有內置方法(如用例是相當深奧的),但你可以隨便寫一個:

def removeDups(duptest, iterable): 
    res = [] 
    for e in iterable: 
    if not any(duptest(e, r) for r in res): 
     res.append(e) 
    return res 

現在,在控制檯:

>>> removeDups(lambda x,y: x+y == 10, [2,3,5,7,8]) 
[2, 3, 5] 
>>> removeDups(lambda x,y: x+y == 10, [2,3,6,7,8]) 
[2, 3, 6] 
>>> removeDups(lambda x, y: x+y == 12, [2, 3, 6, 9, 10]) 
[2, 3, 6] 
+0

thx,看起來像我在找什麼。 –

1

remove函數將允許您指定任何成對平等函數。它將保留每組重複的最後一個。

values = [2,3,5,7,8] 

def addstoten(item, other): 
    return item + other == 10 

def remove(eq, values): 
    values = tuple(values) 
    for index, item in enumerate(values): 
     if not any(eq(item, other) for other in values[index + 1:]): 
      yield item 

print list(remove(addstoten, values)) 
+0

我認爲最後一行應該是'print(list(remove(...)))'。此外,這可悲的是不能在iterables上工作,只是在列表上。 – phihag

+0

@phihag他說'採取平等測試和列表作爲參數',但它可以很容易地工作在迭代以及如果你不介意'元組'他們。 – agf