-
阿波罗的战车
本质上,这是一个“唯一性过滤器”,但是我们指定了一个 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)]在这里,我们将始终保留第一次出现的“重复项”。
-
三国纷争
让我提供一个稍微不同的解决方案。请注意,这不是我用于一次性脚本的东西,而是用于真正的项目。因为你[(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)]
-
哔哔one
制作一个满足您条件的新列表可能更容易。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)]