假设两个数据集是有序的并且它们包含成对匹配,发现对的有效方法是什么?两个列表都可能有噪音。
从集合A,B集合C将由成对(A [X 1 ],B [Y 1 ])组成,(A [X 2 ],B [Y 2 ]),...,(A [X 名词],B [Y 名词 ])使得X 1 < X 2 < ......< X n 和Y 1 < Y 2 < ......< ÿ名词
问题可以通过简化的Python块来证明,其中如何验证成功对的详细信息是无关紧要的。 因为验证条件是无关的,所以条件return_pairs(A,B,validate)== return_pairs(B,A,validate)不需要保持,因为A,B中的数据不需要相同,只是必须存在(A [x],B [y])的验证函数
A = [0,0,0,1,2,0,3,4,0,5,6,0,7,0,0,8,0,0,9]
B = [1,2,0,0,0,0,0,3,0,0,4,0,5,6,0,0,7,0,0,8,0,9]
B1 = [1,2,0,0,0,0,0,3,0,0,4,0,5,6,0,0,7,7,7,0,0,8,0,9]
def validate(a,b):
return a and b and a==b
def return_pairs(A,B, validation):
ret = []
x,y = 0,0
# Do loops and index changes...
if validation(A[x], B[y]):
ret.append((A[x], B[y]))
return ret
assert zip(range(1,10), range(1,10)) == return_pairs(A,B,validate)
assert zip(range(1,10), range(1,10)) == return_pairs(A,B1,validate)
答案 0 :(得分:0)
不是在两个嵌套循环中迭代每个列表,而是先根据自己的标准删除噪声,然后使用过滤后的元素创建第三个列表,并根据验证运行列表中的每个项目(作为新形成的元组) 。这是假设我正确地理解了这个问题,我认为我并不是这样:
A = [0,0,0,1,2,0,3,4,0,5,6,0,7,0,0,8,0,0,9]
B = [1,2,0,0,0,0,0,3,0,0,4,0,5,6,0,0,7,0,0,8,0,9]
def clean(oldList):
newList = []
for item in oldList:
if 0<item and (not newList or item>newList[-1]):
newList.append(item)
return newList
def validate(C):
for item in C:
if item[0] != item[1]:
return False
return True
C = zip(clean(A),clean(B))
#clean(A):[1, 2, 3, 4, 5, 6, 7, 8, 9]
#clean(B):[1, 2, 3, 4, 5, 6, 7, 8, 9]
#list(C):[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
#validate(C): True
答案 1 :(得分:-1)
解决方案。为O(n 2 )
def return_pairs(A,B, validation):
ret = []
used_x, used_y = -1,-1
for x, _x in enumerate(A):
for y, _y in enumerate(B):
if x <= used_x or y <= used_y:
continue
if validation(A[x], B[y]):
used_x,used_y = x,y
ret.append((A[x], B[y]))
return ret