为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕仙森 2021-08-11 21:29:25
我有一个元组列表,我想删除元组,以便列表中只有一个具有给定长度和总和的元组。这是一个糟糕的解释,例如:[(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) 但我很确定这会删除所有元组并且控制台崩溃了。
查看完整描述

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)]

在这里,我们将始终保留第一次出现的“重复项”。


查看完整回答
反对 回复 2021-08-11
?
三国纷争

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)]


查看完整回答
反对 回复 2021-08-11
?
哔哔one

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)]


查看完整回答
反对 回复 2021-08-11
  • 3 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信