如果我有一个整数列表S: [[1,2,3],[3,4,5],[5,6,7]]
和一个列表T: [2,3,1]
的列表。如果T作为一个组合包含在S中,我想返回true。假设S
的每个元素与T
的长度相同。
在这种情况下,我想返回true。
限制:没有任何类型的排序,并且注意S具有所有唯一列表,但在列表中,它可以具有重复元素。
如何尽可能高效地完成此操作。我可以遍历S
的每个元素并将其转换为集合并将其与set(T)
进行比较,但如果S
的大小和{{1}的每个元素的长度,这似乎非常慢变大了。
答案 0 :(得分:0)
使用itertools?
from itertools import combinations
for i in combinations(t, len(t)): if i in s: return True;
或使用已排序:
t = sorted(t)
for i in s: if sorted(i)==t: return True
答案 1 :(得分:0)
您可以使用sorted
:
>>> S = [[1,2,3],[3,4,5],[5,6,7]]
>>> T = [2,3,1]
>>> any(sorted(T) == sorted(x) for x in S)
True
答案 2 :(得分:0)
收藏和反击?它将在O(n)中运行,而排序将大致以O(n log n)运行,原始比较将为O(n²)
{{1}}
答案 3 :(得分:0)
如果规定没有排序,您可能需要查看组合的与顺序无关的哈希函数。我喜欢的两个起点是(1)组合中各个元素的哈希值的总和,以及(2)元组(sum(combination), product(combination))
。