在2D数组中删除重复项的最省时的方法是什么?

问题描述 投票:0回答:2

因此,我已经使用itertools生成了一个组合列表,并且得到的结果看起来像这样:

nums = [-5,5,4,-3,0,0,4,-2]
x = [x for x in set(itertools.combinations(nums, 4)) if sum(x)==target]

>>> x = [(-5, 5, 0, 4), (-5, 5, 4, 0), (5, 4, -3, -2), (5, -3, 4, -2)]

什么是去除无序重复项(例如x [0]和x [1]是重复项的最省时的方法)。有内置的处理方法,我的一般方法是在一个元素中创建所有元素的计数器,然后与下一个元素进行比较。这是最好的方法吗?

谢谢您的指导。

python python-3.x list set itertools
2个回答
0
投票

这是执行(O(n) + O(nlogn))的方法:

def remove_dups(x):
    y = []
    y_sorted = []
    for i in x:
        ii = sorted(i)
        if ii in y_sorted:
            pass
        else:
            y_sorted.append(ii)
            y.append(i)
    return y

remove_dups(x)
[(-5, 5, 0, 4), (5, 4, -3, -2)]

说明:

  1. y = []:存储列表中的唯一元组
  2. y_sorted = []:是一个查找列表,用于检查是否已经存在重复项。

0
投票

您需要一种方法来表示x内容的唯一性/重复项,而不仅仅是单个元素内。为此,您将希望x本身是set而不是list

但是,这不能解决以下问题,即元素(是元组)中的顺序仍会使相似的元素被视为不同的值。再一次,您可以使用set代表各个组合来解决此问题。因此,代码应如下所示。但是,这仍然将不起作用

>>> set(set(x) for x in itertools.combinations(nums, 4) if sum(x) == target)
TypeError: unhashable type: 'set'

这是最好的解释here,但摘要是您

无法将可变对象放在set

我们可以改用frozenset解决此问题。最终给出了预期的结果:

frozenset
© www.soinside.com 2019 - 2024. All rights reserved.