2011-09-04 5 views
2

nubBy in Haskell과 비슷한 Python 함수를 찾고 있는데, 중복을 제거하지만 다른 평등 테스트를 사용합니다.파이썬에서 다른 평등 테스트를 사용하여 중복 제거

이 함수는 동등성 테스트와 매개 변수를 매개 변수로 사용하며 중복이없는 요소의 목록을 반환합니다.

예 :

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

(2, 10) 및 (8, 3)은 중복된다. 나는 출력이 [10, 9, 6] 또는 [2, 3, 6]인지 상관하지 않는다.

파이썬에서 이에 상응하는 내장 함수가 있습니까? 그렇지 않은 경우 효율적으로 구현하는 가장 좋은 방법은 무엇입니까?

답변

2

아무 내장 방법 (사용의 경우와는 다소 난해한 없음),하지만 당신은 쉽게 하나 쓸 수있다 :

>>> 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

xx, 내가 찾고있는 것 같습니다. –

1

remove : 콘솔에서 지금

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

을 함수는 pairwise equality 함수를 지정할 수있게합니다. 그것은 각 복제본 집합의 마지막을 유지합니다.

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 그는 평등성 테스트와리스트를 매개 변수로 사용한다고 말했지만'튜플을 신경 쓰지 않는다면 iterables에서도 쉽게 작동 할 수 있습니다. – agf