繁体   English   中英

查找两个大小不同的数组的所有匹配项

[英]Find all matchings of two differently sized arrays

因此,我有两个不同的列表,说:

list1 = [a,b,c,d] 
list2 = [e,f,g] 

我的目标是找出这两个列表之间的最小差异。 我有一个定义的函数d(x,y) ,它给出两个元素xy之间的差。 它们如此匹配:list1中的每个元素都匹配list2中的一个或零个元素。 不匹配的元素还具有d(a)给出的“差异”。

我不确定执行此操作的最佳算法是什么,或者我将如何处理。 如果相关,我正在使用python。

我认为您希望在二部图中进行匹配: http : //en.wikipedia.org/wiki/Matching_( graph_theory) #Maximum_matchings_in_bipartite_graphs您应该使用匹配算法。 如果不能,那么请使用整数编程。 Pulp是适合整数编程的python软件包。 Integer编程包会慢很多,但可能更容易编写代码。

如果选择使用整数编程,则约束条件是变量Aij表示list1 [i]和list2 [j]之间的连接。 Aij = 1或0。(连接打开或关闭)。 Sum(i上的Aij)=1。(list1中每个元素一个连接)。 Sum(j上的Aij)= 1(列表2中每个元素一个连接)。 现在您要最大化/最小化目标函数sum(d(list1 [i],list2 [j])* Aij)。 不要忘记,如果length list1!= length list2,则必须添加额外的变量,以允许某些变量以成本d(x)连接到自身,并将其添加到目标函数中。

我不太确定您要问的基本上是查找两个列表之间共有的所有元素。

在这种情况下,这可能会起作用:

list1 = [1,2,3,4]
list2 = [3,4,5]
diff = set(list1).intersection(set(list2))

我认为这个问题有点含糊,但我的想法是:

尽管我想知道OP是否正在寻找列表或类似产品。

也许,如果OP通过itertools函数进行浏览,他们可能会看到一些合适的东西。

import random

list1 = random.sample(range(50), 3)
list2 = random.sample(range(50), 2)

print "List1", list1
print "List2", list2


def router(a, b):
    print "ROUTER", a, b
    if a == None:
        return b * 10
    elif b == None:
        return a * 10
    else:
        return (a + b ) * 10


print map(router, list1, list2)

##########################
# Using itertools.product
##########################
import itertools

def pair(p):
    a, b = p
    print "PAIR", a, b
    if a == None:
        return b * 10
    elif b == None:
        return a * 10
    else:
        return (a + b ) * 10

product = itertools.product(*zip(*map(None, list1, list2)))

print map(pair, product)

输出量

List1 [17, 48, 9]
List2 [45, 42]
ROUTER 17 45
ROUTER 48 42
ROUTER 9 None
[620, 900, 90]
PAIR 17 45
PAIR 17 42
PAIR 17 None
PAIR 48 45
PAIR 48 42
PAIR 48 None
PAIR 9 45
PAIR 9 42
PAIR 9 None
[620, 590, 170, 930, 900, 480, 540, 510, 90]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM