Удалите дубликаты с помощью другого теста на равенство в Python - PullRequest
2 голосов
/ 05 сентября 2011

Я ищу функцию Python, похожую на nubBy в Haskell , которая удаляет дубликаты, но с другим тестом на равенство.list в качестве параметров и возвращает список элементов без дубликатов.

Пример :

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 ]

2 голосов
/ 05 сентября 2011

Нет встроенного метода (поскольку сценарий использования довольно эзотерический), но вы можете легко написать один:

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]
1 голос
/ 05 сентября 2011

Эта функция 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))
...