我正在寻找类似于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)和(9和3)是重复的。我不关心输出是[10, 9, 6]
还是[2, 3, 6]
。
Python中是否有等效的内置函数?如果没有,有效实施它的最佳方法是什么?
答案 0 :(得分: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]
答案 1 :(得分: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))