因此,我已经使用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]是重复项的最省时的方法)。有内置的处理方法,我的一般方法是在一个元素中创建所有元素的计数器,然后与下一个元素进行比较。这是最好的方法吗?
谢谢您的指导。
这是执行(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)]
说明:
y = []
:存储列表中的唯一元组y_sorted = []
:是一个查找列表,用于检查是否已经存在重复项。您需要一种方法来表示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