Python从满足给定条件的列表中删除元组

我有一个元组列表,我想删除元组,以便列表中只有一个具有给定长度和总和的元组。


这是一个糟糕的解释,例如:


[(0,1,2), (0,2,1), (0,0,1)] 

删除 (0,1,2) 或 (0,2,1)


我希望能够遍历列表并删除满足以下条件的任何元组:


len(tuple1) == len(tuple2) and sum(tuple1) == sum(tuple2)

但在列表中保留 tuple1 或 tuple2。


我试过了:


for t1 in list:

    for t2 in list:

           if len(t1) == len(t2) and sum(t1) == sum(t2):

               list.remove(t1) 

但我很确定这会删除所有元组并且控制台崩溃了。


慕仙森
浏览 204回答 3
3回答

阿波罗的战车

本质上,这是一个“唯一性过滤器”,但是我们指定了一个 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)]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python