3 回答
TA贡献1862条经验 获得超6个赞
本质上,这是一个“唯一性过滤器”,但是我们指定了一个 function f,并且只有f(x)第二次发生时,我们才会将该元素过滤掉。
我们可以实现这样的 uniqness 过滤器,给定f(x)产生可散列的值,使用:
def uniq(iterable, key=lambda x: x):
seen = set()
for item in iterable:
u = key(item)
if u not in seen:
yield item
seen.add(u)
然后我们可以使用这个过滤器:
result = list(uniq(data, lambda x: (len(x), sum(x))))
例如:
>>> list(uniq(data, lambda x: (len(x), sum(x))))
[(0, 1, 2), (0, 0, 1)]
在这里,我们将始终保留第一次出现的“重复项”。
TA贡献1804条经验 获得超7个赞
让我提供一个稍微不同的解决方案。请注意,这不是我用于一次性脚本的东西,而是用于真正的项目。因为你[(0, 0, 1)]实际上代表了一些逻辑/物理的东西。
set(..)删除重复项。我们用那个怎么样?唯一要记住的是需要修改元素的哈希值和相等性。
class Converted(object):
def __init__(self, tup):
self.tup = tup
self.transformed = len(tup), sum(tup)
def __eq__(self, other):
return self.transformed == other.transformed
def __hash__(self):
return hash(self.transformed)
inp = [(0,1,2), (0,2,1), (0,0,1)]
out = [x.tup for x in set(map(Converted, inp))]
print(out)
# [(0, 0, 1), (0, 1, 2)]
TA贡献1854条经验 获得超8个赞
制作一个满足您条件的新列表可能更容易。
old_list = [(0,1,2), (0,2,1), (0,0,1)]
new_list = []
for old_t in old_list:
for new_t in new_list:
if len(old_t) == len(new_t) and sum(old_t) == sum(new_t):
break
else:
new_list.append(old_t)
# new_list == [(0, 1, 2), (0, 0, 1)]
添加回答
举报